diff options
Diffstat (limited to 'src/widgets/itemviews/qtablewidget.cpp')
-rw-r--r-- | src/widgets/itemviews/qtablewidget.cpp | 593 |
1 files changed, 289 insertions, 304 deletions
diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index d576d323c3..6dd812f6fb 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -1,45 +1,8 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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) 2016 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 "qtablewidget.h" -#include <qitemdelegate.h> #include <qpainter.h> #include <private/qtablewidget_p.h> @@ -49,7 +12,7 @@ QT_BEGIN_NAMESPACE QTableModel::QTableModel(int rows, int columns, QTableWidget *parent) : QAbstractTableModel(parent), - prototype(0), + prototype(nullptr), tableItems(rows * columns, 0), verticalHeaderItems(rows, 0), horizontalHeaderItems(columns, 0) @@ -63,12 +26,12 @@ QTableModel::~QTableModel() bool QTableModel::insertRows(int row, int count, const QModelIndex &) { - if (count < 1 || row < 0 || row > verticalHeaderItems.count()) + if (count < 1 || row < 0 || row > verticalHeaderItems.size()) return false; beginInsertRows(QModelIndex(), row, row + count - 1); - int rc = verticalHeaderItems.count(); - int cc = horizontalHeaderItems.count(); + int rc = verticalHeaderItems.size(); + int cc = horizontalHeaderItems.size(); verticalHeaderItems.insert(row, count, 0); if (rc == 0) tableItems.resize(cc * count); @@ -80,12 +43,12 @@ bool QTableModel::insertRows(int row, int count, const QModelIndex &) bool QTableModel::insertColumns(int column, int count, const QModelIndex &) { - if (count < 1 || column < 0 || column > horizontalHeaderItems.count()) + if (count < 1 || column < 0 || column > horizontalHeaderItems.size()) return false; beginInsertColumns(QModelIndex(), column, column + count - 1); - int rc = verticalHeaderItems.count(); - int cc = horizontalHeaderItems.count(); + int rc = verticalHeaderItems.size(); + int cc = horizontalHeaderItems.size(); horizontalHeaderItems.insert(column, count, 0); if (cc == 0) tableItems.resize(rc * count); @@ -98,24 +61,24 @@ bool QTableModel::insertColumns(int column, int count, const QModelIndex &) bool QTableModel::removeRows(int row, int count, const QModelIndex &) { - if (count < 1 || row < 0 || row + count > verticalHeaderItems.count()) + if (count < 1 || row < 0 || row + count > verticalHeaderItems.size()) return false; beginRemoveRows(QModelIndex(), row, row + count - 1); int i = tableIndex(row, 0); int n = count * columnCount(); - QTableWidgetItem *oldItem = 0; + QTableWidgetItem *oldItem = nullptr; for (int j = i; j < n + i; ++j) { oldItem = tableItems.at(j); if (oldItem) - oldItem->view = 0; + oldItem->view = nullptr; delete oldItem; } tableItems.remove(qMax(i, 0), n); for (int v = row; v < row + count; ++v) { oldItem = verticalHeaderItems.at(v); if (oldItem) - oldItem->view = 0; + oldItem->view = nullptr; delete oldItem; } verticalHeaderItems.remove(row, count); @@ -125,17 +88,17 @@ bool QTableModel::removeRows(int row, int count, const QModelIndex &) bool QTableModel::removeColumns(int column, int count, const QModelIndex &) { - if (count < 1 || column < 0 || column + count > horizontalHeaderItems.count()) + if (count < 1 || column < 0 || column + count > horizontalHeaderItems.size()) return false; beginRemoveColumns(QModelIndex(), column, column + count - 1); - QTableWidgetItem *oldItem = 0; + QTableWidgetItem *oldItem = nullptr; for (int row = rowCount() - 1; row >= 0; --row) { int i = tableIndex(row, column); for (int j = i; j < i + count; ++j) { oldItem = tableItems.at(j); if (oldItem) - oldItem->view = 0; + oldItem->view = nullptr; delete oldItem; } tableItems.remove(i, count); @@ -143,7 +106,7 @@ bool QTableModel::removeColumns(int column, int count, const QModelIndex &) for (int h=column; h<column+count; ++h) { oldItem = horizontalHeaderItems.at(h); if (oldItem) - oldItem->view = 0; + oldItem->view = nullptr; delete oldItem; } horizontalHeaderItems.remove(column, count); @@ -154,7 +117,7 @@ bool QTableModel::removeColumns(int column, int count, const QModelIndex &) void QTableModel::setItem(int row, int column, QTableWidgetItem *item) { int i = tableIndex(row, column); - if (i < 0 || i >= tableItems.count()) + if (i < 0 || i >= tableItems.size()) return; QTableWidgetItem *oldItem = tableItems.at(i); if (item == oldItem) @@ -162,7 +125,7 @@ void QTableModel::setItem(int row, int column, QTableWidgetItem *item) // remove old if (oldItem) - oldItem->view = 0; + oldItem->view = nullptr; delete tableItems.at(i); QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent()); @@ -176,23 +139,23 @@ void QTableModel::setItem(int row, int column, QTableWidgetItem *item) && view->horizontalHeader()->sortIndicatorSection() == column) { // sorted insertion Qt::SortOrder order = view->horizontalHeader()->sortIndicatorOrder(); - QVector<QTableWidgetItem*> colItems = columnItems(column); - if (row < colItems.count()) + QList<QTableWidgetItem *> colItems = columnItems(column); + if (row < colItems.size()) colItems.remove(row); int sortedRow; - if (item == 0) { + if (item == nullptr) { // move to after all non-0 (sortable) items - sortedRow = colItems.count(); + sortedRow = colItems.size(); } else { - QVector<QTableWidgetItem*>::iterator it; + QList<QTableWidgetItem *>::iterator it; it = sortedInsertionIterator(colItems.begin(), colItems.end(), order, item); sortedRow = qMax((int)(it - colItems.begin()), 0); } if (sortedRow != row) { - emit layoutAboutToBeChanged(); + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); // move the items @ row to sortedRow int cc = columnCount(); - QVector<QTableWidgetItem*> rowItems(cc); + QList<QTableWidgetItem *> rowItems(cc); for (int j = 0; j < cc; ++j) rowItems[j] = tableItems.at(tableIndex(row, j)); tableItems.remove(tableIndex(row, 0), cc); @@ -209,7 +172,7 @@ void QTableModel::setItem(int row, int column, QTableWidgetItem *item) changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); - emit layoutChanged(); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); return; } } @@ -222,7 +185,7 @@ QTableWidgetItem *QTableModel::takeItem(int row, int column) long i = tableIndex(row, column); QTableWidgetItem *itm = tableItems.value(i); if (itm) { - itm->view = 0; + itm->view = nullptr; itm->d->id = -1; tableItems[i] = 0; const QModelIndex ind = index(row, column); @@ -239,7 +202,7 @@ QTableWidgetItem *QTableModel::item(int row, int column) const QTableWidgetItem *QTableModel::item(const QModelIndex &index) const { if (!isValid(index)) - return 0; + return nullptr; return tableItems.at(tableIndex(index.row(), index.column())); } @@ -247,8 +210,8 @@ void QTableModel::removeItem(QTableWidgetItem *item) { int i = tableItems.indexOf(item); if (i != -1) { - tableItems[i] = 0; QModelIndex idx = index(item); + tableItems[i] = nullptr; emit dataChanged(idx, idx); return; } @@ -270,21 +233,21 @@ void QTableModel::removeItem(QTableWidgetItem *item) void QTableModel::setHorizontalHeaderItem(int section, QTableWidgetItem *item) { - if (section < 0 || section >= horizontalHeaderItems.count()) + if (section < 0 || section >= horizontalHeaderItems.size()) return; QTableWidgetItem *oldItem = horizontalHeaderItems.at(section); if (item == oldItem) return; if (oldItem) - oldItem->view = 0; + oldItem->view = nullptr; delete oldItem; QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent()); if (item) { item->view = view; - item->itemFlags = Qt::ItemFlags(int(item->itemFlags)|ItemIsHeaderItem); + item->d->headerItem = true; } horizontalHeaderItems[section] = item; emit headerDataChanged(Qt::Horizontal, section, section); @@ -292,21 +255,21 @@ void QTableModel::setHorizontalHeaderItem(int section, QTableWidgetItem *item) void QTableModel::setVerticalHeaderItem(int section, QTableWidgetItem *item) { - if (section < 0 || section >= verticalHeaderItems.count()) + if (section < 0 || section >= verticalHeaderItems.size()) return; QTableWidgetItem *oldItem = verticalHeaderItems.at(section); if (item == oldItem) return; if (oldItem) - oldItem->view = 0; + oldItem->view = nullptr; delete oldItem; QTableWidget *view = qobject_cast<QTableWidget*>(QObject::parent()); if (item) { item->view = view; - item->itemFlags = Qt::ItemFlags(int(item->itemFlags)|ItemIsHeaderItem); + item->d->headerItem = true; } verticalHeaderItems[section] = item; emit headerDataChanged(Qt::Vertical, section, section); @@ -314,12 +277,12 @@ void QTableModel::setVerticalHeaderItem(int section, QTableWidgetItem *item) QTableWidgetItem *QTableModel::takeHorizontalHeaderItem(int section) { - if (section < 0 || section >= horizontalHeaderItems.count()) - return 0; + if (section < 0 || section >= horizontalHeaderItems.size()) + return nullptr; QTableWidgetItem *itm = horizontalHeaderItems.at(section); if (itm) { - itm->view = 0; - itm->itemFlags &= ~ItemIsHeaderItem; + itm->view = nullptr; + itm->d->headerItem = false; horizontalHeaderItems[section] = 0; } return itm; @@ -327,12 +290,12 @@ QTableWidgetItem *QTableModel::takeHorizontalHeaderItem(int section) QTableWidgetItem *QTableModel::takeVerticalHeaderItem(int section) { - if (section < 0 || section >= verticalHeaderItems.count()) - return 0; + if (section < 0 || section >= verticalHeaderItems.size()) + return nullptr; QTableWidgetItem *itm = verticalHeaderItems.at(section); if (itm) { - itm->view = 0; - itm->itemFlags &= ~ItemIsHeaderItem; + itm->view = nullptr; + itm->d->headerItem = false; verticalHeaderItems[section] = 0; } return itm; @@ -354,7 +317,7 @@ QModelIndex QTableModel::index(const QTableWidgetItem *item) const return QModelIndex(); int i = -1; const int id = item->d->id; - if (id >= 0 && id < tableItems.count() && tableItems.at(id) == item) { + if (id >= 0 && id < tableItems.size() && tableItems.at(id) == item) { i = id; } else { // we need to search for the item i = tableItems.indexOf(const_cast<QTableWidgetItem*>(item)); @@ -368,7 +331,7 @@ QModelIndex QTableModel::index(const QTableWidgetItem *item) const void QTableModel::setRowCount(int rows) { - int rc = verticalHeaderItems.count(); + int rc = verticalHeaderItems.size(); if (rows < 0 || rc == rows) return; if (rc < rows) @@ -379,7 +342,7 @@ void QTableModel::setRowCount(int rows) void QTableModel::setColumnCount(int columns) { - int cc = horizontalHeaderItems.count(); + int cc = horizontalHeaderItems.size(); if (columns < 0 || cc == columns) return; if (cc < columns) @@ -390,12 +353,12 @@ void QTableModel::setColumnCount(int columns) int QTableModel::rowCount(const QModelIndex &parent) const { - return parent.isValid() ? 0 : verticalHeaderItems.count(); + return parent.isValid() ? 0 : verticalHeaderItems.size(); } int QTableModel::columnCount(const QModelIndex &parent) const { - return parent.isValid() ? 0 : horizontalHeaderItems.count(); + return parent.isValid() ? 0 : horizontalHeaderItems.size(); } QVariant QTableModel::data(const QModelIndex &index, int role) const @@ -436,7 +399,7 @@ QMap<int, QVariant> QTableModel::itemData(const QModelIndex &index) const QMap<int, QVariant> roles; QTableWidgetItem *itm = item(index); if (itm) { - for (int i = 0; i < itm->values.count(); ++i) { + for (int i = 0; i < itm->values.size(); ++i) { roles.insert(itm->values.at(i).role, itm->values.at(i).value); } @@ -454,7 +417,7 @@ bool QTableModel::setItemData(const QModelIndex &index, const QMap<int, QVariant QTableWidgetItem *itm = item(index); if (itm) { itm->view = nullptr; // prohibits item from calling itemChanged() - QVector<int> rolesVec; + QList<int> rolesVec; for (QMap<int, QVariant>::ConstIterator it = roles.constBegin(); it != roles.constEnd(); ++it) { const int role = (it.key() == Qt::EditRole ? Qt::DisplayRole : it.key()); if (itm->data(role) != it.value()) { @@ -480,6 +443,22 @@ bool QTableModel::setItemData(const QModelIndex &index, const QMap<int, QVariant return true; } +bool QTableModel::clearItemData(const QModelIndex &index) +{ + if (!checkIndex(index, CheckIndexOption::IndexIsValid)) + return false; + QTableWidgetItem *itm = item(index); + if (!itm) + return false; + const auto beginIter = itm->values.cbegin(); + const auto endIter = itm->values.cend(); + if (std::all_of(beginIter, endIter, [](const QWidgetItemData& data) -> bool { return !data.value.isValid(); })) + return true; //it's already cleared + itm->values.clear(); + emit dataChanged(index, index, QList<int> {}); + return true; +} + Qt::ItemFlags QTableModel::flags(const QModelIndex &index) const { if (!index.isValid()) @@ -496,8 +475,8 @@ Qt::ItemFlags QTableModel::flags(const QModelIndex &index) const void QTableModel::sort(int column, Qt::SortOrder order) { - QVector<QPair<QTableWidgetItem*, int> > sortable; - QVector<int> unsortable; + QList<QPair<QTableWidgetItem *, int>> sortable; + QList<int> unsortable; sortable.reserve(rowCount()); unsortable.reserve(rowCount()); @@ -512,7 +491,7 @@ void QTableModel::sort(int column, Qt::SortOrder order) const auto compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); std::stable_sort(sortable.begin(), sortable.end(), compare); - QVector<QTableWidgetItem*> sorted_table(tableItems.count()); + QList<QTableWidgetItem *> sorted_table(tableItems.size()); QModelIndexList from; QModelIndexList to; const int numRows = rowCount(); @@ -520,9 +499,9 @@ void QTableModel::sort(int column, Qt::SortOrder order) from.reserve(numRows * numColumns); to.reserve(numRows * numColumns); for (int i = 0; i < numRows; ++i) { - int r = (i < sortable.count() + int r = (i < sortable.size() ? sortable.at(i).second - : unsortable.at(i - sortable.count())); + : unsortable.at(i - sortable.size())); for (int c = 0; c < numColumns; ++c) { sorted_table[tableIndex(i, c)] = item(r, c); from.append(createIndex(r, c)); @@ -530,12 +509,12 @@ void QTableModel::sort(int column, Qt::SortOrder order) } } - emit layoutAboutToBeChanged(); + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); tableItems = sorted_table; changePersistentIndexList(from, to); // ### slow - emit layoutChanged(); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); } /* @@ -549,11 +528,11 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, int start, int end) { int count = end - start + 1; - QVector < QPair<QTableWidgetItem*,int> > sorting; + QList<QPair<QTableWidgetItem *, int>> sorting; sorting.reserve(count); for (int row = start; row <= end; ++row) { QTableWidgetItem *itm = item(row, column); - if (itm == 0) { + if (itm == nullptr) { // no more sortable items (all 0-items are // at the end of the table when it is sorted) break; @@ -564,30 +543,33 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, const auto compare = (order == Qt::AscendingOrder ? &itemLessThan : &itemGreaterThan); std::stable_sort(sorting.begin(), sorting.end(), compare); QModelIndexList oldPersistentIndexes, newPersistentIndexes; - QVector<QTableWidgetItem*> newTable = tableItems; - QVector<QTableWidgetItem*> newVertical = verticalHeaderItems; - QVector<QTableWidgetItem*> colItems = columnItems(column); - QVector<QTableWidgetItem*>::iterator vit = colItems.begin(); + QList<QTableWidgetItem *> newTable = tableItems; + QList<QTableWidgetItem *> newVertical = verticalHeaderItems; + QList<QTableWidgetItem *> colItems = columnItems(column); + QList<QTableWidgetItem *>::iterator vit = colItems.begin(); + qsizetype distanceFromBegin = 0; bool changed = false; - for (int i = 0; i < sorting.count(); ++i) { + for (int i = 0; i < sorting.size(); ++i) { + distanceFromBegin = std::distance(colItems.begin(), vit); int oldRow = sorting.at(i).second; QTableWidgetItem *item = colItems.at(oldRow); colItems.remove(oldRow); - vit = sortedInsertionIterator(vit, colItems.end(), order, item); + vit = sortedInsertionIterator(colItems.begin() + distanceFromBegin, colItems.end(), order, + item); int newRow = qMax((int)(vit - colItems.begin()), 0); if ((newRow < oldRow) && !(*item < *colItems.at(oldRow - 1)) && !(*colItems.at(oldRow - 1) < *item)) newRow = oldRow; vit = colItems.insert(vit, item); if (newRow != oldRow) { if (!changed) { - emit layoutAboutToBeChanged(); + emit layoutAboutToBeChanged({}, QAbstractItemModel::VerticalSortHint); oldPersistentIndexes = persistentIndexList(); newPersistentIndexes = oldPersistentIndexes; changed = true; } // move the items @ oldRow to newRow int cc = columnCount(); - QVector<QTableWidgetItem*> rowItems(cc); + QList<QTableWidgetItem *> rowItems(cc); for (int j = 0; j < cc; ++j) rowItems[j] = newTable.at(tableIndex(oldRow, j)); newTable.remove(tableIndex(oldRow, 0), cc); @@ -600,7 +582,7 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, // update persistent indexes updateRowIndexes(newPersistentIndexes, oldRow, newRow); // the index of the remaining rows may have changed - for (int j = i + 1; j < sorting.count(); ++j) { + for (int j = i + 1; j < sorting.size(); ++j) { int otherRow = sorting.at(j).second; if (oldRow < otherRow && newRow >= otherRow) --sorting[j].second; @@ -615,7 +597,7 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, verticalHeaderItems = newVertical; changePersistentIndexList(oldPersistentIndexes, newPersistentIndexes); - emit layoutChanged(); + emit layoutChanged({}, QAbstractItemModel::VerticalSortHint); } } @@ -624,14 +606,14 @@ void QTableModel::ensureSorted(int column, Qt::SortOrder order, Returns the non-0 items in column \a column. */ -QVector<QTableWidgetItem*> QTableModel::columnItems(int column) const +QList<QTableWidgetItem *> QTableModel::columnItems(int column) const { - QVector<QTableWidgetItem*> items; + QList<QTableWidgetItem *> items; int rc = rowCount(); items.reserve(rc); for (int row = 0; row < rc; ++row) { QTableWidgetItem *itm = item(row, column); - if (itm == 0) { + if (itm == nullptr) { // no more sortable items (all 0-items are // at the end of the table when it is sorted) break; @@ -673,10 +655,10 @@ void QTableModel::updateRowIndexes(QModelIndexList &indexes, inserted in the interval (\a begin, \a end) according to the given sort \a order. */ -QVector<QTableWidgetItem*>::iterator QTableModel::sortedInsertionIterator( - const QVector<QTableWidgetItem*>::iterator &begin, - const QVector<QTableWidgetItem*>::iterator &end, - Qt::SortOrder order, QTableWidgetItem *item) +QList<QTableWidgetItem *>::iterator +QTableModel::sortedInsertionIterator(const QList<QTableWidgetItem *>::iterator &begin, + const QList<QTableWidgetItem *>::iterator &end, + Qt::SortOrder order, QTableWidgetItem *item) { if (order == Qt::AscendingOrder) return std::lower_bound(begin, end, item, QTableModelLessThan()); @@ -700,10 +682,10 @@ QVariant QTableModel::headerData(int section, Qt::Orientation orientation, int r if (section < 0) return QVariant(); - QTableWidgetItem *itm = 0; - if (orientation == Qt::Horizontal && section < horizontalHeaderItems.count()) + QTableWidgetItem *itm = nullptr; + if (orientation == Qt::Horizontal && section < horizontalHeaderItems.size()) itm = horizontalHeaderItems.at(section); - else if (orientation == Qt::Vertical && section < verticalHeaderItems.count()) + else if (orientation == Qt::Vertical && section < verticalHeaderItems.size()) itm = verticalHeaderItems.at(section); else return QVariant(); // section is out of bounds @@ -723,7 +705,7 @@ bool QTableModel::setHeaderData(int section, Qt::Orientation orientation, (orientation == Qt::Vertical && verticalHeaderItems.size() <= section)) return false; - QTableWidgetItem *itm = 0; + QTableWidgetItem *itm = nullptr; if (orientation == Qt::Horizontal) itm = horizontalHeaderItems.at(section); else @@ -738,22 +720,22 @@ bool QTableModel::setHeaderData(int section, Qt::Orientation orientation, bool QTableModel::isValid(const QModelIndex &index) const { return (index.isValid() - && index.row() < verticalHeaderItems.count() - && index.column() < horizontalHeaderItems.count()); + && index.row() < verticalHeaderItems.size() + && index.column() < horizontalHeaderItems.size()); } void QTableModel::clear() { - for (int j = 0; j < verticalHeaderItems.count(); ++j) { + for (int j = 0; j < verticalHeaderItems.size(); ++j) { if (verticalHeaderItems.at(j)) { - verticalHeaderItems.at(j)->view = 0; + verticalHeaderItems.at(j)->view = nullptr; delete verticalHeaderItems.at(j); verticalHeaderItems[j] = 0; } } - for (int k = 0; k < horizontalHeaderItems.count(); ++k) { + for (int k = 0; k < horizontalHeaderItems.size(); ++k) { if (horizontalHeaderItems.at(k)) { - horizontalHeaderItems.at(k)->view = 0; + horizontalHeaderItems.at(k)->view = nullptr; delete horizontalHeaderItems.at(k); horizontalHeaderItems[k] = 0; } @@ -764,9 +746,9 @@ void QTableModel::clear() void QTableModel::clearContents() { beginResetModel(); - for (int i = 0; i < tableItems.count(); ++i) { + for (int i = 0; i < tableItems.size(); ++i) { if (tableItems.at(i)) { - tableItems.at(i)->view = 0; + tableItems.at(i)->view = nullptr; delete tableItems.at(i); tableItems[i] = 0; } @@ -774,11 +756,11 @@ void QTableModel::clearContents() endResetModel(); } -void QTableModel::itemChanged(QTableWidgetItem *item, const QVector<int> &roles) +void QTableModel::itemChanged(QTableWidgetItem *item, const QList<int> &roles) { if (!item) return; - if (item->flags() & ItemIsHeaderItem) { + if (item->d->headerItem) { int row = verticalHeaderItems.indexOf(item); if (row >= 0) { emit headerDataChanged(Qt::Vertical, row, row); @@ -826,7 +808,7 @@ QMimeData *QTableModel::internalMimeData() const QMimeData *QTableModel::mimeData(const QModelIndexList &indexes) const { QList<QTableWidgetItem*> items; - const int indexesCount = indexes.count(); + const int indexesCount = indexes.size(); items.reserve(indexesCount); for (int i = 0; i < indexesCount; ++i) items << item(indexes.at(i)); @@ -835,7 +817,7 @@ QMimeData *QTableModel::mimeData(const QModelIndexList &indexes) const // cachedIndexes is a little hack to avoid copying from QModelIndexList to // QList<QTreeWidgetItem*> and back again in the view cachedIndexes = indexes; - QMimeData *mimeData = (view ? view->mimeData(items) : 0); + QMimeData *mimeData = (view ? view->mimeData(items) : nullptr); cachedIndexes.clear(); return mimeData; } @@ -882,40 +864,36 @@ Qt::DropActions QTableModel::supportedDropActions() const */ /*! - Constructs an table selection range, i.e. a range + \fn QTableWidgetSelectionRange::QTableWidgetSelectionRange() + + Constructs an empty table selection range, i.e. a range whose rowCount() and columnCount() are 0. + + \sa topRow(), leftColumn(), bottomRow(), rightColumn() */ -QTableWidgetSelectionRange::QTableWidgetSelectionRange() - : top(-1), left(-1), bottom(-2), right(-2) -{ -} /*! + \fn QTableWidgetSelectionRange::QTableWidgetSelectionRange(int top, int left, int bottom, int right) + Constructs the table selection range from the given \a top, \a left, \a bottom and \a right table rows and columns. \sa topRow(), leftColumn(), bottomRow(), rightColumn() */ -QTableWidgetSelectionRange::QTableWidgetSelectionRange(int top, int left, int bottom, int right) - : top(top), left(left), bottom(bottom), right(right) -{ -} /*! - Constructs a the table selection range by copying the given \a - other table selection range. + \fn bool QTableWidgetSelectionRange::operator==(const QTableWidgetSelectionRange &lhs, const QTableWidgetSelectionRange &rhs) + \since 6.3 + + Returns true if \a lhs and \a rhs are equal, otherwise returns false. */ -QTableWidgetSelectionRange::QTableWidgetSelectionRange(const QTableWidgetSelectionRange &other) - : top(other.top), left(other.left), bottom(other.bottom), right(other.right) -{ -} /*! - Destroys the table selection range. + \fn bool QTableWidgetSelectionRange::operator!=(const QTableWidgetSelectionRange &lhs, const QTableWidgetSelectionRange &rhs) + \since 6.3 + + Returns true if \a lhs and \a rhs are not equal, otherwise returns false. */ -QTableWidgetSelectionRange::~QTableWidgetSelectionRange() -{ -} /*! \fn int QTableWidgetSelectionRange::topRow() const @@ -1037,24 +1015,6 @@ QTableWidgetSelectionRange::~QTableWidgetSelectionRange() */ /*! - \fn void QTableWidgetItem::setSelected(bool select) - \since 4.2 - - Sets the selected state of the item to \a select. - - \sa isSelected() -*/ - -/*! - \fn bool QTableWidgetItem::isSelected() const - \since 4.2 - - Returns \c true if the item is selected, otherwise returns \c false. - - \sa setSelected() -*/ - -/*! \fn QSize QTableWidgetItem::sizeHint() const \since 4.1 @@ -1066,8 +1026,8 @@ QTableWidgetSelectionRange::~QTableWidgetSelectionRange() \since 4.1 Sets the size hint for the table item to be \a size. - If no size hint is set, the item delegate will compute the - size hint based on the item data. + If no size hint is set or \a size is invalid, the item + delegate will compute the size hint based on the item data. */ /*! @@ -1091,6 +1051,44 @@ QTableWidgetSelectionRange::~QTableWidgetSelectionRange() */ /*! + \fn bool QTableWidgetItem::isSelected() const + \since 4.2 + + Returns \c true if the item is selected, otherwise returns \c false. + + \sa setSelected() +*/ +bool QTableWidgetItem::isSelected() const +{ + if (!view || !view->selectionModel()) + return false; + const QTableModel *model = qobject_cast<const QTableModel*>(view->model()); + if (!model) + return false; + const QModelIndex index = model->index(this); + return view->selectionModel()->isSelected(index); +} + +/*! + \fn void QTableWidgetItem::setSelected(bool select) + \since 4.2 + + Sets the selected state of the item to \a select. + + \sa isSelected() +*/ +void QTableWidgetItem::setSelected(bool select) +{ + if (!view || !view->selectionModel()) + return; + const QTableModel *model = qobject_cast<const QTableModel*>(view->model()); + if (!model) + return; + const QModelIndex index = model->index(this); + view->selectionModel()->select(index, select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect); +} + +/*! \fn Qt::ItemFlags QTableWidgetItem::flags() const Returns the flags used to describe the item. These determine whether @@ -1110,7 +1108,7 @@ QTableWidgetSelectionRange::~QTableWidgetSelectionRange() void QTableWidgetItem::setFlags(Qt::ItemFlags aflags) { itemFlags = aflags; - if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : 0)) + if (QTableModel *model = tableModel()) model->itemChanged(this); } @@ -1214,20 +1212,6 @@ void QTableWidgetItem::setFlags(Qt::ItemFlags aflags) */ /*! - \fn QColor QTableWidgetItem::backgroundColor() const - \obsolete - - This function is deprecated. Use background() instead. -*/ - -/*! - \fn void QTableWidgetItem::setBackgroundColor(const QColor &color) - \obsolete - - This function is deprecated. Use setBackground() instead. -*/ - -/*! \fn QBrush QTableWidgetItem::background() const \since 4.2 @@ -1241,25 +1225,13 @@ void QTableWidgetItem::setFlags(Qt::ItemFlags aflags) \since 4.2 Sets the item's background brush to the specified \a brush. + Setting a default-constructed brush will let the view use the + default color from the style. \sa setForeground() */ /*! - \fn QColor QTableWidgetItem::textColor() const - \obsolete - - This function is deprecated. Use foreground() instead. -*/ - -/*! - \fn void QTableWidgetItem::setTextColor(const QColor &color) - \obsolete - - This function is deprecated. Use setForeground() instead. -*/ - -/*! \fn QBrush QTableWidgetItem::foreground() const \since 4.2 @@ -1273,19 +1245,36 @@ void QTableWidgetItem::setFlags(Qt::ItemFlags aflags) \since 4.2 Sets the item's foreground brush to the specified \a brush. + Setting a default-constructed brush will let the view use the + default color from the style. \sa setBackground() */ /*! + \if defined(qt7) + + \fn Qt::Alignment QTableWidgetItem::textAlignment() const + + Returns the text alignment for the list item. + + \else + \fn int QTableWidgetItem::textAlignment() const Returns the text alignment for the item's text. + \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 QTableWidgetItem::setTextAlignment(int alignment) Sets the text alignment for the item's text to the \a alignment @@ -1295,13 +1284,27 @@ void QTableWidgetItem::setFlags(Qt::ItemFlags aflags) */ /*! + \since 6.4 + + \fn void QTableWidgetItem::setTextAlignment(Qt::Alignment alignment) + + Sets the text alignment for the item's text to the \a alignment + specified. +*/ + +/*! + \fn void QTableWidgetItem::setTextAlignment(Qt::AlignmentFlag alignment) + \internal +*/ + +/*! Constructs a table item of the specified \a type that does not belong to any table. \sa type() */ QTableWidgetItem::QTableWidgetItem(int type) - : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), + : rtti(type), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(Qt::ItemIsEditable |Qt::ItemIsSelectable |Qt::ItemIsUserCheckable @@ -1317,7 +1320,7 @@ QTableWidgetItem::QTableWidgetItem(int type) \sa type() */ QTableWidgetItem::QTableWidgetItem(const QString &text, int type) - : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), + : rtti(type), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(Qt::ItemIsEditable |Qt::ItemIsSelectable |Qt::ItemIsUserCheckable @@ -1334,7 +1337,7 @@ QTableWidgetItem::QTableWidgetItem(const QString &text, int type) \sa type() */ QTableWidgetItem::QTableWidgetItem(const QIcon &icon, const QString &text, int type) - : rtti(type), view(0), d(new QTableWidgetItemPrivate(this)), + : rtti(type), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(Qt::ItemIsEditable |Qt::ItemIsSelectable |Qt::ItemIsUserCheckable @@ -1351,9 +1354,8 @@ QTableWidgetItem::QTableWidgetItem(const QIcon &icon, const QString &text, int t */ QTableWidgetItem::~QTableWidgetItem() { - if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : 0)) + if (QTableModel *model = tableModel()) model->removeItem(this); - view = 0; delete d; } @@ -1377,7 +1379,7 @@ void QTableWidgetItem::setData(int role, const QVariant &value) { bool found = false; role = (role == Qt::EditRole ? Qt::DisplayRole : role); - for (int i = 0; i < values.count(); ++i) { + for (int i = 0; i < values.size(); ++i) { if (values.at(i).role == role) { if (values[i].value == value) return; @@ -1389,11 +1391,11 @@ void QTableWidgetItem::setData(int role, const QVariant &value) } if (!found) values.append(QWidgetItemData(role, value)); - if (QTableModel *model = (view ? qobject_cast<QTableModel*>(view->model()) : nullptr)) + if (QTableModel *model = tableModel()) { - const QVector<int> roles((role == Qt::DisplayRole) ? - QVector<int>({Qt::DisplayRole, Qt::EditRole}) : - QVector<int>({role})); + const QList<int> roles((role == Qt::DisplayRole) + ? QList<int>({ Qt::DisplayRole, Qt::EditRole }) + : QList<int>({ role })); model->itemChanged(this, roles); } } @@ -1444,6 +1446,16 @@ void QTableWidgetItem::write(QDataStream &out) const } /*! + \internal + returns the QTableModel if a view is set +*/ +QTableModel *QTableWidgetItem::tableModel() const +{ + return (view ? qobject_cast<QTableModel*>(view->model()) : nullptr); +} + + +/*! \relates QTableWidgetItem Reads a table widget item from stream \a in into \a item. @@ -1486,7 +1498,7 @@ QDataStream &operator<<(QDataStream &out, const QTableWidgetItem &item) \sa data(), flags() */ QTableWidgetItem::QTableWidgetItem(const QTableWidgetItem &other) - : rtti(Type), values(other.values), view(0), + : rtti(Type), values(other.values), view(nullptr), d(new QTableWidgetItemPrivate(this)), itemFlags(other.itemFlags) { @@ -1579,28 +1591,41 @@ QTableWidgetItem &QTableWidgetItem::operator=(const QTableWidgetItem &other) void QTableWidgetPrivate::setup() { Q_Q(QTableWidget); - // view signals - QObject::connect(q, SIGNAL(pressed(QModelIndex)), q, SLOT(_q_emitItemPressed(QModelIndex))); - QObject::connect(q, SIGNAL(clicked(QModelIndex)), q, SLOT(_q_emitItemClicked(QModelIndex))); - QObject::connect(q, SIGNAL(doubleClicked(QModelIndex)), - q, SLOT(_q_emitItemDoubleClicked(QModelIndex))); - QObject::connect(q, SIGNAL(activated(QModelIndex)), q, SLOT(_q_emitItemActivated(QModelIndex))); - QObject::connect(q, SIGNAL(entered(QModelIndex)), q, SLOT(_q_emitItemEntered(QModelIndex))); - // model signals - QObject::connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), - q, SLOT(_q_emitItemChanged(QModelIndex))); - // selection signals - QObject::connect(q->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), - q, SLOT(_q_emitCurrentItemChanged(QModelIndex,QModelIndex))); - QObject::connect(q->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), - q, SIGNAL(itemSelectionChanged())); - // sorting - QObject::connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), - q, SLOT(_q_dataChanged(QModelIndex,QModelIndex))); - QObject::connect(model, SIGNAL(columnsRemoved(QModelIndex,int,int)), q, SLOT(_q_sort())); -} - -void QTableWidgetPrivate::_q_emitItemPressed(const QModelIndex &index) + connections = { + // view signals + QObjectPrivate::connect(q, &QTableWidget::pressed, + this, &QTableWidgetPrivate::emitItemPressed), + QObjectPrivate::connect(q, &QTableWidget::clicked, + this, &QTableWidgetPrivate::emitItemClicked), + QObjectPrivate::connect(q, &QTableWidget::doubleClicked, + this, &QTableWidgetPrivate::emitItemDoubleClicked), + QObjectPrivate::connect(q, &QTableWidget::activated, + this, &QTableWidgetPrivate::emitItemActivated), + QObjectPrivate::connect(q, &QTableWidget::entered, + this, &QTableWidgetPrivate::emitItemEntered), + // model signals + QObjectPrivate::connect(model, &QAbstractItemModel::dataChanged, + this, &QTableWidgetPrivate::emitItemChanged), + // selection signals + QObjectPrivate::connect(q->selectionModel(), &QItemSelectionModel::currentChanged, + this, &QTableWidgetPrivate::emitCurrentItemChanged), + QObject::connect(q->selectionModel(), &QItemSelectionModel::selectionChanged, + q, &QTableWidget::itemSelectionChanged), + // sorting + QObjectPrivate::connect(model, &QAbstractItemModel::dataChanged, + this, &QTableWidgetPrivate::dataChanged), + QObjectPrivate::connect(model, &QAbstractItemModel::columnsRemoved, + this, &QTableWidgetPrivate::sort) + }; +} + +void QTableWidgetPrivate::clearConnections() +{ + for (const QMetaObject::Connection &connection : connections) + QObject::disconnect(connection); +} + +void QTableWidgetPrivate::emitItemPressed(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1608,7 +1633,7 @@ void QTableWidgetPrivate::_q_emitItemPressed(const QModelIndex &index) emit q->cellPressed(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitItemClicked(const QModelIndex &index) +void QTableWidgetPrivate::emitItemClicked(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1616,7 +1641,7 @@ void QTableWidgetPrivate::_q_emitItemClicked(const QModelIndex &index) emit q->cellClicked(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitItemDoubleClicked(const QModelIndex &index) +void QTableWidgetPrivate::emitItemDoubleClicked(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1624,7 +1649,7 @@ void QTableWidgetPrivate::_q_emitItemDoubleClicked(const QModelIndex &index) emit q->cellDoubleClicked(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitItemActivated(const QModelIndex &index) +void QTableWidgetPrivate::emitItemActivated(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1632,7 +1657,7 @@ void QTableWidgetPrivate::_q_emitItemActivated(const QModelIndex &index) emit q->cellActivated(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitItemEntered(const QModelIndex &index) +void QTableWidgetPrivate::emitItemEntered(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1640,7 +1665,7 @@ void QTableWidgetPrivate::_q_emitItemEntered(const QModelIndex &index) emit q->cellEntered(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitItemChanged(const QModelIndex &index) +void QTableWidgetPrivate::emitItemChanged(const QModelIndex &index) { Q_Q(QTableWidget); if (QTableWidgetItem *item = tableModel()->item(index)) @@ -1648,7 +1673,7 @@ void QTableWidgetPrivate::_q_emitItemChanged(const QModelIndex &index) emit q->cellChanged(index.row(), index.column()); } -void QTableWidgetPrivate::_q_emitCurrentItemChanged(const QModelIndex ¤t, +void QTableWidgetPrivate::emitCurrentItemChanged(const QModelIndex ¤t, const QModelIndex &previous) { Q_Q(QTableWidget); @@ -1659,7 +1684,7 @@ void QTableWidgetPrivate::_q_emitCurrentItemChanged(const QModelIndex ¤t, emit q->currentCellChanged(current.row(), current.column(), previous.row(), previous.column()); } -void QTableWidgetPrivate::_q_sort() +void QTableWidgetPrivate::sort() { if (sortingEnabled) { int column = horizontalHeader->sortIndicatorSection(); @@ -1668,8 +1693,8 @@ void QTableWidgetPrivate::_q_sort() } } -void QTableWidgetPrivate::_q_dataChanged(const QModelIndex &topLeft, - const QModelIndex &bottomRight) +void QTableWidgetPrivate::dataChanged(const QModelIndex &topLeft, + const QModelIndex &bottomRight) { if (sortingEnabled && topLeft.isValid() && bottomRight.isValid()) { int column = horizontalHeader->sortIndicatorSection(); @@ -1867,6 +1892,8 @@ QTableWidget::QTableWidget(int rows, int columns, QWidget *parent) */ QTableWidget::~QTableWidget() { + Q_D(QTableWidget); + d->clearConnections(); } /*! @@ -1987,7 +2014,7 @@ QTableWidgetItem *QTableWidget::takeItem(int row, int column) Q_D(QTableWidget); QTableWidgetItem *item = d->tableModel()->takeItem(row, column); if (item) - item->view = 0; + item->view = nullptr; return item; } @@ -2023,7 +2050,7 @@ QTableWidgetItem *QTableWidget::takeVerticalHeaderItem(int row) Q_D(QTableWidget); QTableWidgetItem *itm = d->tableModel()->takeVerticalHeaderItem(row); if (itm) - itm->view = 0; + itm->view = nullptr; return itm; } @@ -2062,7 +2089,7 @@ QTableWidgetItem *QTableWidget::takeHorizontalHeaderItem(int column) Q_D(QTableWidget); QTableWidgetItem *itm = d->tableModel()->takeHorizontalHeaderItem(column); if (itm) - itm->view = 0; + itm->view = nullptr; return itm; } @@ -2073,8 +2100,8 @@ void QTableWidget::setVerticalHeaderLabels(const QStringList &labels) { Q_D(QTableWidget); QTableModel *model = d->tableModel(); - QTableWidgetItem *item = 0; - for (int i = 0; i < model->rowCount() && i < labels.count(); ++i) { + QTableWidgetItem *item = nullptr; + for (int i = 0; i < model->rowCount() && i < labels.size(); ++i) { item = model->verticalHeaderItem(i); if (!item) { item = model->createItem(); @@ -2091,8 +2118,8 @@ void QTableWidget::setHorizontalHeaderLabels(const QStringList &labels) { Q_D(QTableWidget); QTableModel *model = d->tableModel(); - QTableWidgetItem *item = 0; - for (int i = 0; i < model->columnCount() && i < labels.count(); ++i) { + QTableWidgetItem *item = nullptr; + for (int i = 0; i < model->columnCount() && i < labels.size(); ++i) { item = model->horizontalHeaderItem(i); if (!item) { item = model->createItem(); @@ -2306,35 +2333,6 @@ void QTableWidget::setCellWidget(int row, int column, QWidget *widget) } /*! - Returns \c true if the \a item is selected, otherwise returns \c false. - - \obsolete - - This function is deprecated. Use \l{QTableWidgetItem::isSelected()} instead. -*/ - -bool QTableWidget::isItemSelected(const QTableWidgetItem *item) const -{ - Q_D(const QTableWidget); - QModelIndex index = d->tableModel()->index(item); - return selectionModel()->isSelected(index); -} - -/*! - Selects or deselects \a item depending on \a select. - - \obsolete - - This function is deprecated. Use \l{QTableWidgetItem::setSelected()} instead. -*/ -void QTableWidget::setItemSelected(const QTableWidgetItem *item, bool select) -{ - Q_D(QTableWidget); - QModelIndex index = d->tableModel()->index(item); - selectionModel()->select(index, select ? QItemSelectionModel::Select : QItemSelectionModel::Deselect); -} - -/*! Selects or deselects the \a range depending on \a select. */ void QTableWidget::setRangeSelected(const QTableWidgetSelectionRange &range, bool select) @@ -2360,13 +2358,13 @@ QList<QTableWidgetSelectionRange> QTableWidget::selectedRanges() const { const QList<QItemSelectionRange> ranges = selectionModel()->selection(); QList<QTableWidgetSelectionRange> result; - const int rangesCount = ranges.count(); + const int rangesCount = ranges.size(); result.reserve(rangesCount); for (int i = 0; i < rangesCount; ++i) - result.append(QTableWidgetSelectionRange(ranges.at(i).top(), - ranges.at(i).left(), - ranges.at(i).bottom(), - ranges.at(i).right())); + result.append({ranges.at(i).top(), + ranges.at(i).left(), + ranges.at(i).bottom(), + ranges.at(i).right()}); return result; } @@ -2587,14 +2585,10 @@ QStringList QTableWidget::mimeTypes() const \a items. The format used to describe the items is obtained from the mimeTypes() function. - If the list of items is empty, 0 is returned rather than a serialized - empty list. + If the list of items is empty, \nullptr is returned rather than a + serialized empty list. */ -#if QT_VERSION >= QT_VERSION_CHECK(6,0,0) QMimeData *QTableWidget::mimeData(const QList<QTableWidgetItem *> &items) const -#else -QMimeData *QTableWidget::mimeData(const QList<QTableWidgetItem*> items) const -#endif { Q_D(const QTableWidget); @@ -2602,7 +2596,7 @@ QMimeData *QTableWidget::mimeData(const QList<QTableWidgetItem*> items) const // if non empty, it's called from the model's own mimeData if (cachedIndexes.isEmpty()) { - cachedIndexes.reserve(items.count()); + cachedIndexes.reserve(items.size()); for (QTableWidgetItem *item : items) cachedIndexes << indexFromItem(item); @@ -2673,18 +2667,6 @@ QModelIndex QTableWidget::indexFromItem(const QTableWidgetItem *item) const return d->tableModel()->index(item); } -#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) -/*! - \internal - \obsolete - \overload -*/ -QModelIndex QTableWidget::indexFromItem(QTableWidgetItem *item) const -{ - return indexFromItem(const_cast<const QTableWidgetItem *>(item)); -} -#endif - /*! Returns a pointer to the QTableWidgetItem associated with the given \a index. */ @@ -2718,7 +2700,8 @@ void QTableWidget::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 QModelIndexList indexes = selectedIndexes(); int top = INT_MAX; int left = INT_MAX; @@ -2728,7 +2711,7 @@ void QTableWidget::dropEvent(QDropEvent *event) { } QList<QTableWidgetItem *> taken; - const int indexesCount = indexes.count(); + const int indexesCount = indexes.size(); taken.reserve(indexesCount); for (const auto &index : indexes) taken.append(takeItem(index.row(), index.column())); @@ -2740,9 +2723,11 @@ void QTableWidget::dropEvent(QDropEvent *event) { } event->accept(); - // Don't want QAbstractItemView to delete it because it was "moved" we already did it - event->setDropAction(Qt::CopyAction); } + // 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; } QTableView::dropEvent(event); |