diff options
Diffstat (limited to 'src/widgets/itemviews/qtreewidget.cpp')
-rw-r--r-- | src/widgets/itemviews/qtreewidget.cpp | 414 |
1 files changed, 186 insertions, 228 deletions
diff --git a/src/widgets/itemviews/qtreewidget.cpp b/src/widgets/itemviews/qtreewidget.cpp index 12b39f3541..8e46a0efbe 100644 --- a/src/widgets/itemviews/qtreewidget.cpp +++ b/src/widgets/itemviews/qtreewidget.cpp @@ -1,47 +1,10 @@ -/**************************************************************************** -** -** Copyright (C) 2019 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtWidgets module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ +// Copyright (C) 2019 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #include "qtreewidget.h" #include <qheaderview.h> #include <qpainter.h> -#include <qitemdelegate.h> #include <qstack.h> #include <qdebug.h> #include <private/qtreewidget_p.h> @@ -112,8 +75,9 @@ public: */ QTreeModel::QTreeModel(int columns, QTreeWidget *parent) - : QAbstractItemModel(parent), rootItem(new QTreeWidgetItem), - headerItem(new QTreeWidgetItem), skipPendingSort(false) + : QAbstractItemModel(*new QTreeModelPrivate, parent), + rootItem(new QTreeWidgetItem), + headerItem(new QTreeWidgetItem) { rootItem->view = parent; rootItem->itemFlags = Qt::ItemIsDropEnabled; @@ -127,8 +91,7 @@ QTreeModel::QTreeModel(int columns, QTreeWidget *parent) */ QTreeModel::QTreeModel(QTreeModelPrivate &dd, QTreeWidget *parent) - : QAbstractItemModel(dd, parent), rootItem(new QTreeWidgetItem), - headerItem(new QTreeWidgetItem), skipPendingSort(false) + : QAbstractItemModel(dd, parent), rootItem(new QTreeWidgetItem), headerItem(new QTreeWidgetItem) { rootItem->view = parent; rootItem->itemFlags = Qt::ItemIsDropEnabled; @@ -240,7 +203,7 @@ QModelIndex QTreeModel::index(const QTreeWidgetItem *item, int column) const int row; int guess = item->d->rowGuess; if (guess >= 0 - && par->children.count() > guess + && par->children.size() > guess && par->children.at(guess) == itm) { row = guess; } else { @@ -417,8 +380,8 @@ QMap<int, QVariant> QTreeModel::itemData(const QModelIndex &index) const QTreeWidgetItem *itm = item(index); if (itm) { int column = index.column(); - if (column < itm->values.count()) { - for (int i = 0; i < itm->values.at(column).count(); ++i) { + if (column < itm->values.size()) { + for (int i = 0; i < itm->values.at(column).size(); ++i) { roles.insert(itm->values.at(column).at(i).role, itm->values.at(column).at(i).value); } @@ -487,9 +450,9 @@ bool QTreeModel::insertColumns(int column, int count, const QModelIndex &parent) while (!itemstack.isEmpty()) { QTreeWidgetItem *par = itemstack.pop(); QList<QTreeWidgetItem*> children = par ? par->children : rootItem->children; - for (int row = 0; row < children.count(); ++row) { + for (int row = 0; row < children.size(); ++row) { QTreeWidgetItem *child = children.at(row); - if (child->children.count()) + if (child->children.size()) itemstack.push(child); child->values.insert(column, count, QList<QWidgetItemData>()); } @@ -506,22 +469,18 @@ bool QTreeModel::insertColumns(int column, int count, const QModelIndex &parent) bool QTreeModel::removeRows(int row, int count, const QModelIndex &parent) { if (count < 1 || row < 0 || (row + count) > rowCount(parent)) return false; - - beginRemoveRows(parent, row, row + count - 1); - - QSignalBlocker blocker(this); - - QTreeWidgetItem *itm = item(parent); + QTreeWidgetItem *parentItem = item(parent); + // if parentItem is valid, begin/end RemoveRows is handled by takeChild below + if (!parentItem) + beginRemoveRows(parent, row, row + count - 1); for (int i = row + count - 1; i >= row; --i) { - QTreeWidgetItem *child = itm ? itm->takeChild(i) : rootItem->children.takeAt(i); + QTreeWidgetItem *child = parentItem ? parentItem->takeChild(i) : rootItem->children.takeAt(i); Q_ASSERT(child); child->view = nullptr; delete child; - child = nullptr; } - blocker.unblock(); - - endRemoveRows(); + if (!parentItem) + endRemoveRows(); return true; } @@ -667,7 +626,7 @@ void QTreeModel::ensureSorted(int column, Qt::SortOrder order, else if (oldRow > otherRow && newRow <= otherRow) ++sorting[j].second; } - for (int k = 0; k < newPersistentIndexes.count(); ++k) { + for (int k = 0; k < newPersistentIndexes.size(); ++k) { QModelIndex pi = newPersistentIndexes.at(k); if (pi.parent() != parent) continue; @@ -783,7 +742,7 @@ Qt::DropActions QTreeModel::supportedDropActions() const void QTreeModel::itemChanged(QTreeWidgetItem *item) { - SkipSorting skipSorting(this); //this is kind of wrong, but not doing this would kill performence + SkipSorting skipSorting(this); //this is kind of wrong, but not doing this would kill performance QModelIndex left = index(item, 0); QModelIndex right = index(item, item->columnCount() - 1); emit dataChanged(left, right); @@ -814,7 +773,7 @@ void QTreeModel::emitDataChanged(QTreeWidgetItem *item, int column, const QList< return; } - SkipSorting skipSorting(this); //This is a little bit wrong, but not doing it would kill performence + SkipSorting skipSorting(this); //This is a little bit wrong, but not doing it would kill performance QModelIndex bottomRight, topLeft; if (column == -1) { @@ -846,7 +805,7 @@ void QTreeModel::beginRemoveItems(QTreeWidgetItem *parent, int row, int count) if (!parent) parent = rootItem; // now update the iterators - for (int i = 0; i < iterators.count(); ++i) { + for (int i = 0; i < iterators.size(); ++i) { for (int j = 0; j < count; j++) { QTreeWidgetItem *c = parent->child(row + j); iterators[i]->d_func()->ensureValidIterator(c); @@ -867,8 +826,8 @@ void QTreeModel::sortItems(QList<QTreeWidgetItem*> *items, int column, Qt::SortO return; // store the original order of indexes - QList<QPair<QTreeWidgetItem *, int>> sorting(items->count()); - for (int i = 0; i < sorting.count(); ++i) { + QList<QPair<QTreeWidgetItem *, int>> sorting(items->size()); + for (int i = 0; i < sorting.size(); ++i) { sorting[i].first = items->at(i); sorting[i].second = i; } @@ -880,7 +839,7 @@ void QTreeModel::sortItems(QList<QTreeWidgetItem*> *items, int column, Qt::SortO QModelIndexList fromList; QModelIndexList toList; int colCount = columnCount(); - for (int r = 0; r < sorting.count(); ++r) { + for (int r = 0; r < sorting.size(); ++r) { int oldRow = sorting.at(r).second; if (oldRow == r) continue; @@ -1366,17 +1325,49 @@ bool QTreeWidgetItem::isFirstColumnSpanned() const */ /*! + \if defined(qt7) + + \fn Qt::Alignment QTreeWidgetItem::textAlignment(int column) const + + Returns the text alignment for the label in the given \a column. + + \else + \fn int QTreeWidgetItem::textAlignment(int column) const - Returns the text alignment for the label in the given \a column - (see \l{Qt::AlignmentFlag}). + Returns the text alignment for the label in the given \a column. + + \note This function returns an int for historical reasons. It will + be corrected to return Qt::Alignment in Qt 7. + + \sa Qt::Alignment + + \endif */ /*! + \obsolete [6.4] Use the overload that takes a Qt::Alignment argument. + \fn void QTreeWidgetItem::setTextAlignment(int column, int alignment) Sets the text alignment for the label in the given \a column to - the \a alignment specified (see \l{Qt::AlignmentFlag}). + the \a alignment specified. + + \sa Qt::Alignment +*/ + +/*! + \since 6.4 + + \fn void QTreeWidgetItem::setTextAlignment(int column, Qt::Alignment alignment) + + Sets the text alignment for the label in the given \a column to + the \a alignment specified. +*/ + +/*! + \fn void QTreeWidgetItem::setTextAlignment(int column, Qt::AlignmentFlag alignment) + \internal */ /*! @@ -1391,16 +1382,7 @@ bool QTreeWidgetItem::isFirstColumnSpanned() const \sa type() */ -QTreeWidgetItem::QTreeWidgetItem(int type) - : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), - itemFlags(Qt::ItemIsSelectable - |Qt::ItemIsUserCheckable - |Qt::ItemIsEnabled - |Qt::ItemIsDragEnabled - |Qt::ItemIsDropEnabled) -{ -} - +QTreeWidgetItem::QTreeWidgetItem(int type) : rtti(type), d(new QTreeWidgetItemPrivate(this)) { } /*! Constructs a tree widget item of the specified \a type. The item @@ -1411,14 +1393,9 @@ QTreeWidgetItem::QTreeWidgetItem(int type) \sa type() */ QTreeWidgetItem::QTreeWidgetItem(const QStringList &strings, int type) - : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), - itemFlags(Qt::ItemIsSelectable - |Qt::ItemIsUserCheckable - |Qt::ItemIsEnabled - |Qt::ItemIsDragEnabled - |Qt::ItemIsDropEnabled) -{ - for (int i = 0; i < strings.count(); ++i) + : rtti(type), d(new QTreeWidgetItemPrivate(this)) +{ + for (int i = 0; i < strings.size(); ++i) setText(i, strings.at(i)); } @@ -1432,12 +1409,7 @@ QTreeWidgetItem::QTreeWidgetItem(const QStringList &strings, int type) */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, int type) - : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), - itemFlags(Qt::ItemIsSelectable - |Qt::ItemIsUserCheckable - |Qt::ItemIsEnabled - |Qt::ItemIsDragEnabled - |Qt::ItemIsDropEnabled) + : rtti(type), d(new QTreeWidgetItemPrivate(this)) { // do not set this->view here otherwise insertChild() will fail if (QTreeModel *model = treeModel(treeview)) { @@ -1457,14 +1429,9 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, int type) */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, const QStringList &strings, int type) - : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), - itemFlags(Qt::ItemIsSelectable - |Qt::ItemIsUserCheckable - |Qt::ItemIsEnabled - |Qt::ItemIsDragEnabled - |Qt::ItemIsDropEnabled) -{ - for (int i = 0; i < strings.count(); ++i) + : rtti(type), d(new QTreeWidgetItemPrivate(this)) +{ + for (int i = 0; i < strings.size(); ++i) setText(i, strings.at(i)); // do not set this->view here otherwise insertChild() will fail if (QTreeModel *model = treeModel(treeview)) { @@ -1482,12 +1449,7 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, const QStringList &strin \sa type() */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, QTreeWidgetItem *after, int type) - : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), - itemFlags(Qt::ItemIsSelectable - |Qt::ItemIsUserCheckable - |Qt::ItemIsEnabled - |Qt::ItemIsDragEnabled - |Qt::ItemIsDropEnabled) + : rtti(type), d(new QTreeWidgetItemPrivate(this)) { // do not set this->view here otherwise insertChild() will fail if (QTreeModel *model = treeModel(treeview)) { @@ -1503,12 +1465,7 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidget *treeview, QTreeWidgetItem *after, \sa type() */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, int type) - : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), - itemFlags(Qt::ItemIsSelectable - |Qt::ItemIsUserCheckable - |Qt::ItemIsEnabled - |Qt::ItemIsDragEnabled - |Qt::ItemIsDropEnabled) + : rtti(type), d(new QTreeWidgetItemPrivate(this)) { if (parent) parent->addChild(this); @@ -1521,14 +1478,9 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, int type) \sa type() */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &strings, int type) - : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), - itemFlags(Qt::ItemIsSelectable - |Qt::ItemIsUserCheckable - |Qt::ItemIsEnabled - |Qt::ItemIsDragEnabled - |Qt::ItemIsDropEnabled) -{ - for (int i = 0; i < strings.count(); ++i) + : rtti(type), d(new QTreeWidgetItemPrivate(this)) +{ + for (int i = 0; i < strings.size(); ++i) setText(i, strings.at(i)); if (parent) parent->addChild(this); @@ -1543,12 +1495,7 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, const QStringList &str \sa type() */ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *after, int type) - : rtti(type), view(nullptr), d(new QTreeWidgetItemPrivate(this)), par(nullptr), - itemFlags(Qt::ItemIsSelectable - |Qt::ItemIsUserCheckable - |Qt::ItemIsEnabled - |Qt::ItemIsDragEnabled - |Qt::ItemIsDropEnabled) + : rtti(type), d(new QTreeWidgetItemPrivate(this)) { if (parent) { int i = parent->children.indexOf(after) + 1; @@ -1567,11 +1514,8 @@ QTreeWidgetItem::QTreeWidgetItem(QTreeWidgetItem *parent, QTreeWidgetItem *after QTreeWidgetItem::~QTreeWidgetItem() { QTreeModel *model = treeModel(); - bool wasSkipSort = false; - if (model) { - wasSkipSort = model->skipPendingSort; - model->skipPendingSort = true; - } + QTreeModel::SkipSorting skipSorting(model); + if (par) { int i = par->children.indexOf(this); if (i >= 0) { @@ -1599,7 +1543,7 @@ QTreeWidgetItem::~QTreeWidgetItem() } // at this point the persistent indexes for the children should also be invalidated // since we invalidated the parent - for (int i = 0; i < children.count(); ++i) { + for (int i = 0; i < children.size(); ++i) { QTreeWidgetItem *child = children.at(i); // make sure the child does not try to remove itself from our children list child->par = nullptr; @@ -1610,9 +1554,6 @@ QTreeWidgetItem::~QTreeWidgetItem() children.clear(); delete d; - if (model) { - model->skipPendingSort = wasSkipSort; - } } /*! @@ -1710,7 +1651,7 @@ void QTreeWidgetItem::setFlags(Qt::ItemFlags flags) parents.push(this); while (!parents.isEmpty()) { QTreeWidgetItem *parent = parents.pop(); - for (int i = 0; i < parent->children.count(); ++i) { + for (int i = 0; i < parent->children.size(); ++i) { QTreeWidgetItem *child = parent->children.at(i); if (!child->d->disabled) { // if not explicitly disabled parents.push(child); @@ -1739,7 +1680,7 @@ void QTreeWidgetItemPrivate::updateHiddenStatus(QTreeWidgetItem *item, bool inse const QModelIndex index = model->index(parent, 0); item->view->setRowHidden(index.row(), index.parent(), inserting); } - for (int i = 0; i < parent->children.count(); ++i) { + for (int i = 0; i < parent->children.size(); ++i) { QTreeWidgetItem *child = parent->children.at(i); parents.push(child); } @@ -1765,7 +1706,7 @@ void QTreeWidgetItemPrivate::propagateDisabled(QTreeWidgetItem *item) parent->itemChanged(); } - for (int i = 0; i < parent->children.count(); ++i) { + for (int i = 0; i < parent->children.size(); ++i) { QTreeWidgetItem *child = parent->children.at(i); parents.push(child); } @@ -1807,14 +1748,14 @@ void QTreeWidgetItem::setData(int column, int role, const QVariant &value) switch (role) { case Qt::EditRole: case Qt::DisplayRole: { - if (values.count() <= column) { + if (values.size() <= column) { if (model && this == model->headerItem) model->setColumnCount(column + 1); else values.resize(column + 1); } - if (d->display.count() <= column) { - for (int i = d->display.count() - 1; i < column - 1; ++i) + if (d->display.size() <= column) { + for (int i = d->display.size() - 1; i < column - 1; ++i) d->display.append(QVariant()); d->display.append(value); } else if (d->display[column] != value) { @@ -1825,7 +1766,7 @@ void QTreeWidgetItem::setData(int column, int role, const QVariant &value) } break; case Qt::CheckStateRole: if ((itemFlags & Qt::ItemIsAutoTristate) && value != Qt::PartiallyChecked) { - for (int i = 0; i < children.count(); ++i) { + for (int i = 0; i < children.size(); ++i) { QTreeWidgetItem *child = children.at(i); if (child->data(column, role).isValid()) {// has a CheckState Qt::ItemFlags f = itemFlags; // a little hack to avoid multiple dataChanged signals @@ -1837,10 +1778,10 @@ void QTreeWidgetItem::setData(int column, int role, const QVariant &value) } Q_FALLTHROUGH(); default: - if (column < values.count()) { + if (column < values.size()) { bool found = false; const QList<QWidgetItemData> column_values = values.at(column); - for (int i = 0; i < column_values.count(); ++i) { + for (int i = 0; i < column_values.size(); ++i) { if (column_values.at(i).role == role) { if (column_values.at(i).value == value) return; // value is unchanged @@ -1881,12 +1822,12 @@ QVariant QTreeWidgetItem::data(int column, int role) const switch (role) { case Qt::EditRole: case Qt::DisplayRole: - if (column >= 0 && column < d->display.count()) + if (column >= 0 && column < d->display.size()) return d->display.at(column); break; case Qt::CheckStateRole: // special case for check state in tristate - if (children.count() && (itemFlags & Qt::ItemIsAutoTristate)) + if (children.size() && (itemFlags & Qt::ItemIsAutoTristate)) return childrenCheckState(column); Q_FALLTHROUGH(); default: @@ -1928,9 +1869,9 @@ void QTreeWidgetItem::read(QDataStream &in) d->display.clear(); in >> values; // move the display value over to the display string list - for (int column = 0; column < values.count(); ++column) { + for (int column = 0; column < values.size(); ++column) { d->display << QVariant(); - for (int i = 0; i < values.at(column).count(); ++i) { + for (int i = 0; i < values.at(column).size(); ++i) { if (values.at(column).at(i).role == Qt::DisplayRole) { d->display[column] = values.at(column).at(i).value; values[column].remove(i--); @@ -1964,8 +1905,9 @@ void QTreeWidgetItem::write(QDataStream &out) const \sa data(), flags() */ QTreeWidgetItem::QTreeWidgetItem(const QTreeWidgetItem &other) - : rtti(Type), values(other.values), view(nullptr), - d(new QTreeWidgetItemPrivate(this)), par(nullptr), + : rtti(Type), + values(other.values), + d(new QTreeWidgetItemPrivate(this)), itemFlags(other.itemFlags) { d->display = other.d->display; @@ -1996,8 +1938,8 @@ QTreeWidgetItem &QTreeWidgetItem::operator=(const QTreeWidgetItem &other) void QTreeWidgetItem::addChild(QTreeWidgetItem *child) { if (child) { - insertChild(children.count(), child); - child->d->rowGuess = children.count() - 1; + insertChild(children.size(), child); + child->d->rowGuess = children.size() - 1; } } @@ -2008,12 +1950,11 @@ void QTreeWidgetItem::addChild(QTreeWidgetItem *child) */ void QTreeWidgetItem::insertChild(int index, QTreeWidgetItem *child) { - if (index < 0 || index > children.count() || child == nullptr || child->view != nullptr || child->par != nullptr) + if (index < 0 || index > children.size() || child == nullptr || child->view != nullptr || child->par != nullptr) return; if (QTreeModel *model = treeModel()) { - const bool wasSkipSort = model->skipPendingSort; - model->skipPendingSort = true; + QTreeModel::SkipSorting skipSorting(model); if (model->rootItem == this) child->par = nullptr; else @@ -2031,13 +1972,12 @@ void QTreeWidgetItem::insertChild(int index, QTreeWidgetItem *child) QTreeWidgetItem *i = stack.pop(); i->view = view; i->values.reserve(cols); - for (int c = 0; c < i->children.count(); ++c) + for (int c = 0; c < i->children.size(); ++c) stack.push(i->children.at(c)); } children.insert(index, child); d->updateHiddenStatus(child, true); model->endInsertItems(); - model->skipPendingSort = wasSkipSort; } else { child->par = this; children.insert(index, child); @@ -2071,7 +2011,7 @@ QTreeWidgetItem *QTreeWidgetItem::takeChild(int index) model->skipPendingSort = false; model->executePendingSort(); } - if (index >= 0 && index < children.count()) { + if (index >= 0 && index < children.size()) { if (model) model->beginRemoveItems(this, index, 1); d->updateHiddenStatus(children.at(index), false); QTreeWidgetItem *item = children.takeAt(index); @@ -2081,7 +2021,7 @@ QTreeWidgetItem *QTreeWidgetItem::takeChild(int index) while (!stack.isEmpty()) { QTreeWidgetItem *i = stack.pop(); i->view = nullptr; - for (int c = 0; c < i->children.count(); ++c) + for (int c = 0; c < i->children.size(); ++c) stack.push(i->children.at(c)); } d->propagateDisabled(item); @@ -2100,7 +2040,7 @@ QTreeWidgetItem *QTreeWidgetItem::takeChild(int index) */ void QTreeWidgetItem::addChildren(const QList<QTreeWidgetItem*> &children) { - insertChildren(this->children.count(), children); + insertChildren(this->children.size(), children); } /*! @@ -2112,18 +2052,18 @@ void QTreeWidgetItem::addChildren(const QList<QTreeWidgetItem*> &children) */ void QTreeWidgetItem::insertChildren(int index, const QList<QTreeWidgetItem*> &children) { - if (index < 0 || index > this->children.count() || children.isEmpty()) + if (index < 0 || index > this->children.size() || children.isEmpty()) return; if (view && view->isSortingEnabled()) { - for (int n = 0; n < children.count(); ++n) + for (int n = 0; n < children.size(); ++n) insertChild(index, children.at(n)); return; } QTreeModel *model = treeModel(); QStack<QTreeWidgetItem*> stack; QList<QTreeWidgetItem*> itemsToInsert; - for (int n = 0; n < children.count(); ++n) { + for (int n = 0; n < children.size(); ++n) { QTreeWidgetItem *child = children.at(n); if (child->view || child->par) continue; @@ -2143,11 +2083,11 @@ void QTreeWidgetItem::insertChildren(int index, const QList<QTreeWidgetItem*> &c while (!stack.isEmpty()) { QTreeWidgetItem *i = stack.pop(); i->view = view; - for (int c = 0; c < i->children.count(); ++c) + for (int c = 0; c < i->children.size(); ++c) stack.push(i->children.at(c)); } - if (model) model->beginInsertItems(this, index, itemsToInsert.count()); - for (int n = 0; n < itemsToInsert.count(); ++n) { + if (model) model->beginInsertItems(this, index, itemsToInsert.size()); + for (int n = 0; n < itemsToInsert.size(); ++n) { QTreeWidgetItem *child = itemsToInsert.at(n); this->children.insert(index + n, child); if (child->par) @@ -2166,7 +2106,7 @@ void QTreeWidgetItem::insertChildren(int index, const QList<QTreeWidgetItem*> &c QList<QTreeWidgetItem*> QTreeWidgetItem::takeChildren() { QList<QTreeWidgetItem*> removed; - if (children.count() > 0) { + if (children.size() > 0) { QTreeModel *model = treeModel(); if (model) { // This will trigger a layoutChanged signal, thus we might want to optimize @@ -2175,8 +2115,8 @@ QList<QTreeWidgetItem*> QTreeWidgetItem::takeChildren() // is updated in case we take an item that is selected. model->executePendingSort(); } - if (model) model->beginRemoveItems(this, 0, children.count()); - for (int n = 0; n < children.count(); ++n) { + if (model) model->beginRemoveItems(this, 0, children.size()); + for (int n = 0; n < children.size(); ++n) { QTreeWidgetItem *item = children.at(n); item->par = nullptr; QStack<QTreeWidgetItem*> stack; @@ -2184,7 +2124,7 @@ QList<QTreeWidgetItem*> QTreeWidgetItem::takeChildren() while (!stack.isEmpty()) { QTreeWidgetItem *i = stack.pop(); i->view = nullptr; - for (int c = 0; c < i->children.count(); ++c) + for (int c = 0; c < i->children.size(); ++c) stack.push(i->children.at(c)); } d->propagateDisabled(item); @@ -2360,37 +2300,43 @@ QDataStream &operator>>(QDataStream &in, QTreeWidgetItem &item) #endif // QT_NO_DATASTREAM -void QTreeWidgetPrivate::_q_emitItemPressed(const QModelIndex &index) +void QTreeWidgetPrivate::clearConnections() +{ + for (const QMetaObject::Connection &connection : connections) + QObject::disconnect(connection); +} + +void QTreeWidgetPrivate::emitItemPressed(const QModelIndex &index) { Q_Q(QTreeWidget); emit q->itemPressed(item(index), index.column()); } -void QTreeWidgetPrivate::_q_emitItemClicked(const QModelIndex &index) +void QTreeWidgetPrivate::emitItemClicked(const QModelIndex &index) { Q_Q(QTreeWidget); emit q->itemClicked(item(index), index.column()); } -void QTreeWidgetPrivate::_q_emitItemDoubleClicked(const QModelIndex &index) +void QTreeWidgetPrivate::emitItemDoubleClicked(const QModelIndex &index) { Q_Q(QTreeWidget); emit q->itemDoubleClicked(item(index), index.column()); } -void QTreeWidgetPrivate::_q_emitItemActivated(const QModelIndex &index) +void QTreeWidgetPrivate::emitItemActivated(const QModelIndex &index) { Q_Q(QTreeWidget); emit q->itemActivated(item(index), index.column()); } -void QTreeWidgetPrivate::_q_emitItemEntered(const QModelIndex &index) +void QTreeWidgetPrivate::emitItemEntered(const QModelIndex &index) { Q_Q(QTreeWidget); emit q->itemEntered(item(index), index.column()); } -void QTreeWidgetPrivate::_q_emitItemChanged(const QModelIndex &index) +void QTreeWidgetPrivate::emitItemChanged(const QModelIndex &index) { Q_Q(QTreeWidget); QTreeWidgetItem *indexItem = item(index); @@ -2398,19 +2344,19 @@ void QTreeWidgetPrivate::_q_emitItemChanged(const QModelIndex &index) emit q->itemChanged(indexItem, index.column()); } -void QTreeWidgetPrivate::_q_emitItemExpanded(const QModelIndex &index) +void QTreeWidgetPrivate::emitItemExpanded(const QModelIndex &index) { Q_Q(QTreeWidget); emit q->itemExpanded(item(index)); } -void QTreeWidgetPrivate::_q_emitItemCollapsed(const QModelIndex &index) +void QTreeWidgetPrivate::emitItemCollapsed(const QModelIndex &index) { Q_Q(QTreeWidget); emit q->itemCollapsed(item(index)); } -void QTreeWidgetPrivate::_q_emitCurrentItemChanged(const QModelIndex ¤t, +void QTreeWidgetPrivate::emitCurrentItemChanged(const QModelIndex ¤t, const QModelIndex &previous) { Q_Q(QTreeWidget); @@ -2419,7 +2365,7 @@ void QTreeWidgetPrivate::_q_emitCurrentItemChanged(const QModelIndex ¤t, emit q->currentItemChanged(currentItem, previousItem); } -void QTreeWidgetPrivate::_q_sort() +void QTreeWidgetPrivate::sort() { if (sortingEnabled) { int column = header->sortIndicatorSection(); @@ -2428,19 +2374,19 @@ void QTreeWidgetPrivate::_q_sort() } } -void QTreeWidgetPrivate::_q_selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) +void QTreeWidgetPrivate::selectionChanged(const QItemSelection &selected, const QItemSelection &deselected) { Q_Q(QTreeWidget); QModelIndexList indices = selected.indexes(); int i; QTreeModel *m = treeModel(); - for (i = 0; i < indices.count(); ++i) { + for (i = 0; i < indices.size(); ++i) { QTreeWidgetItem *item = m->item(indices.at(i)); item->d->selected = true; } indices = deselected.indexes(); - for (i = 0; i < indices.count(); ++i) { + for (i = 0; i < indices.size(); ++i) { QTreeWidgetItem *item = m->item(indices.at(i)); item->d->selected = false; } @@ -2448,8 +2394,8 @@ void QTreeWidgetPrivate::_q_selectionChanged(const QItemSelection &selected, con emit q->itemSelectionChanged(); } -void QTreeWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, - const QModelIndex &bottomRight) +void QTreeWidgetPrivate::dataChanged(const QModelIndex &topLeft, + const QModelIndex &bottomRight) { if (sortingEnabled && topLeft.isValid() && bottomRight.isValid() && !treeModel()->sortPendingTimer.isActive()) { @@ -2507,7 +2453,7 @@ void QTreeWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, whether sorting is enabled. \sa QTreeWidgetItem, QTreeWidgetItemIterator, QTreeView, - {Model/View Programming}, {Settings Editor Example} + {Model/View Programming} */ /*! @@ -2568,9 +2514,6 @@ void QTreeWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, This signal is emitted when the specified \a item is expanded so that all of its children are displayed. - \note This signal will not be emitted if an item changes its state when - expandAll() is invoked. - \sa QTreeWidgetItem::isExpanded(), itemCollapsed(), expandItem() */ @@ -2632,31 +2575,34 @@ void QTreeWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, QTreeWidget::QTreeWidget(QWidget *parent) : QTreeView(*new QTreeWidgetPrivate(), parent) { + Q_D(QTreeWidget); QTreeView::setModel(new QTreeModel(1, this)); - connect(this, SIGNAL(pressed(QModelIndex)), - SLOT(_q_emitItemPressed(QModelIndex))); - connect(this, SIGNAL(clicked(QModelIndex)), - SLOT(_q_emitItemClicked(QModelIndex))); - connect(this, SIGNAL(doubleClicked(QModelIndex)), - SLOT(_q_emitItemDoubleClicked(QModelIndex))); - connect(this, SIGNAL(activated(QModelIndex)), - SLOT(_q_emitItemActivated(QModelIndex))); - connect(this, SIGNAL(entered(QModelIndex)), - SLOT(_q_emitItemEntered(QModelIndex))); - connect(this, SIGNAL(expanded(QModelIndex)), - SLOT(_q_emitItemExpanded(QModelIndex))); - connect(this, SIGNAL(collapsed(QModelIndex)), - SLOT(_q_emitItemCollapsed(QModelIndex))); - connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), - this, SLOT(_q_emitCurrentItemChanged(QModelIndex,QModelIndex))); - connect(model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), - this, SLOT(_q_emitItemChanged(QModelIndex))); - connect(model(), SIGNAL(dataChanged(QModelIndex,QModelIndex)), - this, SLOT(_q_dataChanged(QModelIndex,QModelIndex))); - connect(model(), SIGNAL(columnsRemoved(QModelIndex,int,int)), - this, SLOT(_q_sort())); - connect(selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), - this, SLOT(_q_selectionChanged(QItemSelection,QItemSelection))); + d->connections = { + QObjectPrivate::connect(this, &QTreeWidget::pressed, + d, &QTreeWidgetPrivate::emitItemPressed), + QObjectPrivate::connect(this, &QTreeWidget::clicked, + d, &QTreeWidgetPrivate::emitItemClicked), + QObjectPrivate::connect(this, &QTreeWidget::doubleClicked, + d, &QTreeWidgetPrivate::emitItemDoubleClicked), + QObjectPrivate::connect(this, &QTreeWidget::activated, + d, &QTreeWidgetPrivate::emitItemActivated), + QObjectPrivate::connect(this, &QTreeWidget::entered, + d, &QTreeWidgetPrivate::emitItemEntered), + QObjectPrivate::connect(this, &QTreeWidget::expanded, + d, &QTreeWidgetPrivate::emitItemExpanded), + QObjectPrivate::connect(this, &QTreeWidget::collapsed, + d, &QTreeWidgetPrivate::emitItemCollapsed), + QObjectPrivate::connect(model(), &QAbstractItemModel::dataChanged, + d, &QTreeWidgetPrivate::emitItemChanged), + QObjectPrivate::connect(model(), &QAbstractItemModel::dataChanged, + d, &QTreeWidgetPrivate::dataChanged), + QObjectPrivate::connect(model(), &QAbstractItemModel::columnsRemoved, + d, &QTreeWidgetPrivate::sort), + QObjectPrivate::connect(selectionModel(), &QItemSelectionModel::currentChanged, + d, &QTreeWidgetPrivate::emitCurrentItemChanged), + QObjectPrivate::connect(selectionModel(), &QItemSelectionModel::selectionChanged, + d, &QTreeWidgetPrivate::selectionChanged) + }; header()->setSectionsClickable(false); } @@ -2666,10 +2612,12 @@ QTreeWidget::QTreeWidget(QWidget *parent) QTreeWidget::~QTreeWidget() { + Q_D(QTreeWidget); + d->clearConnections(); } /* - Retuns the number of header columns in the view. + Returns the number of header columns in the view. \sa sortColumn(), currentColumn(), topLevelItemCount() */ @@ -2868,10 +2816,10 @@ void QTreeWidget::setHeaderItem(QTreeWidgetItem *item) void QTreeWidget::setHeaderLabels(const QStringList &labels) { Q_D(QTreeWidget); - if (columnCount() < labels.count()) - setColumnCount(labels.count()); + if (columnCount() < labels.size()) + setColumnCount(labels.size()); QTreeWidgetItem *item = d->treeModel()->headerItem; - for (int i = 0; i < labels.count(); ++i) + for (int i = 0; i < labels.size(); ++i) item->setText(i, labels.at(i)); } @@ -3114,9 +3062,8 @@ QList<QTreeWidgetItem*> QTreeWidget::selectedItems() const Q_D(const QTreeWidget); const QModelIndexList indexes = selectionModel()->selectedIndexes(); QList<QTreeWidgetItem*> items; - items.reserve(indexes.count()); - QDuplicateTracker<QTreeWidgetItem *> seen; - seen.reserve(indexes.count()); + items.reserve(indexes.size()); + QDuplicateTracker<QTreeWidgetItem *> seen(indexes.size()); for (const auto &index : indexes) { QTreeWidgetItem *item = d->item(index); if (item->isHidden() || seen.hasSeen(item)) @@ -3182,7 +3129,7 @@ void QTreeWidget::setSelectionModel(QItemSelectionModel *selectionModel) QTreeView::setSelectionModel(selectionModel); QItemSelection newSelection = selectionModel->selection(); if (!newSelection.isEmpty()) - d->_q_selectionChanged(newSelection, QItemSelection()); + d->selectionChanged(newSelection, QItemSelection()); } /*! @@ -3269,7 +3216,7 @@ QMimeData *QTreeWidget::mimeData(const QList<QTreeWidgetItem *> &items) const return nullptr; } - for (int c = 0; c < item->values.count(); ++c) { + for (int c = 0; c < item->values.size(); ++c) { const QModelIndex index = indexFromItem(item, c); if (Q_UNLIKELY(!index.isValid())) { qWarning() << "QTreeWidget::mimeData: No index associated with item :" << item; @@ -3344,10 +3291,11 @@ void QTreeWidget::dropEvent(QDropEvent *event) { QModelIndex topIndex; int col = -1; int row = -1; - if (d->dropOn(event, &row, &col, &topIndex)) { + // check whether a subclass has already accepted the event, ie. moved the data + if (!event->isAccepted() && d->dropOn(event, &row, &col, &topIndex)) { const QList<QModelIndex> idxs = selectedIndexes(); QList<QPersistentModelIndex> indexes; - const int indexesCount = idxs.count(); + const int indexesCount = idxs.size(); indexes.reserve(indexesCount); for (const auto &idx : idxs) indexes.append(idx); @@ -3370,7 +3318,7 @@ void QTreeWidget::dropEvent(QDropEvent *event) { } // insert them back in at their new positions - for (int i = 0; i < indexes.count(); ++i) { + for (int i = 0; i < indexes.size(); ++i) { // Either at a specific point or appended if (row == -1) { if (topIndex.isValid()) { @@ -3391,9 +3339,11 @@ void QTreeWidget::dropEvent(QDropEvent *event) { } event->accept(); - // Don't want QAbstractItemView to delete it because it was "moved" we already did it - d->dropEventMoved = true; } + // either we or a subclass accepted the move event, so assume that the data was + // moved and that QAbstractItemView shouldn't remove the source when QDrag::exec returns + if (event->isAccepted()) + d->dropEventMoved = true; } QTreeView::dropEvent(event); @@ -3420,6 +3370,14 @@ bool QTreeWidget::event(QEvent *e) return QTreeView::event(e); } +/*! + see QTBUG-94546 +*/ +void QTreeModelPrivate::executePendingOperations() const +{ + q_func()->executePendingSort(); +} + QT_END_NAMESPACE #include "moc_qtreewidget.cpp" |