From d02e7b46a126181a7ede302bfd247b872ccce0de Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Thu, 3 May 2018 21:05:19 +0200 Subject: QTableWidgetItem: pass role to dataChanged() signal QAbstractItemModel::dataChanged() gained an optional role parameter with Qt5 which was not filled within QTableWidgetItem setData() function Task-number: QTBUG-48295 Change-Id: I82289b6db78eeef09d586da267046032984952da Reviewed-by: Samuel Gaist Reviewed-by: Richard Moe Gustavsen --- src/widgets/itemviews/qtablewidget.cpp | 23 ++++++++++------- src/widgets/itemviews/qtablewidget.h | 1 + src/widgets/itemviews/qtablewidget_p.h | 2 +- .../itemviews/qtablewidget/tst_qtablewidget.cpp | 30 +++++++++++++++++----- 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/src/widgets/itemviews/qtablewidget.cpp b/src/widgets/itemviews/qtablewidget.cpp index 1006b11219..ee87aa1615 100644 --- a/src/widgets/itemviews/qtablewidget.cpp +++ b/src/widgets/itemviews/qtablewidget.cpp @@ -453,17 +453,17 @@ bool QTableModel::setItemData(const QModelIndex &index, const QMap(QObject::parent()); QTableWidgetItem *itm = item(index); if (itm) { - itm->view = 0; // prohibits item from calling itemChanged() - bool changed = false; + itm->view = nullptr; // prohibits item from calling itemChanged() + QVector rolesVec; for (QMap::ConstIterator it = roles.constBegin(); it != roles.constEnd(); ++it) { if (itm->data(it.key()) != it.value()) { itm->setData(it.key(), it.value()); - changed = true; + rolesVec += it.key(); } } itm->view = view; - if (changed) - itemChanged(itm); + if (!rolesVec.isEmpty()) + itemChanged(itm, rolesVec); return true; } @@ -771,7 +771,7 @@ void QTableModel::clearContents() endResetModel(); } -void QTableModel::itemChanged(QTableWidgetItem *item) +void QTableModel::itemChanged(QTableWidgetItem *item, const QVector &roles) { if (!item) return; @@ -787,7 +787,7 @@ void QTableModel::itemChanged(QTableWidgetItem *item) } else { QModelIndex idx = index(item); if (idx.isValid()) - emit dataChanged(idx, idx); + emit dataChanged(idx, idx, roles); } } @@ -1386,8 +1386,13 @@ void QTableWidgetItem::setData(int role, const QVariant &value) } if (!found) values.append(QWidgetItemData(role, value)); - if (QTableModel *model = (view ? qobject_cast(view->model()) : 0)) - model->itemChanged(this); + if (QTableModel *model = (view ? qobject_cast(view->model()) : nullptr)) + { + const QVector roles((role == Qt::DisplayRole) ? + QVector({Qt::DisplayRole, Qt::EditRole}) : + QVector({role})); + model->itemChanged(this, roles); + } } /*! diff --git a/src/widgets/itemviews/qtablewidget.h b/src/widgets/itemviews/qtablewidget.h index 7322e3aed7..9de27d164f 100644 --- a/src/widgets/itemviews/qtablewidget.h +++ b/src/widgets/itemviews/qtablewidget.h @@ -302,6 +302,7 @@ Q_SIGNALS: void itemActivated(QTableWidgetItem *item); void itemEntered(QTableWidgetItem *item); + // ### Qt 6: add changed roles void itemChanged(QTableWidgetItem *item); void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous); diff --git a/src/widgets/itemviews/qtablewidget_p.h b/src/widgets/itemviews/qtablewidget_p.h index 74b1f226c1..9899272fce 100644 --- a/src/widgets/itemviews/qtablewidget_p.h +++ b/src/widgets/itemviews/qtablewidget_p.h @@ -157,7 +157,7 @@ public: void clear(); void clearContents(); - void itemChanged(QTableWidgetItem *item); + void itemChanged(QTableWidgetItem *item, const QVector &roles = QVector()); QTableWidgetItem *createItem() const; const QTableWidgetItem *itemPrototype() const; diff --git a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp index 4d4a95b3f5..3af31267c2 100644 --- a/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp +++ b/tests/auto/widgets/itemviews/qtablewidget/tst_qtablewidget.cpp @@ -1343,22 +1343,40 @@ void tst_QTableWidget::setItemWithSorting() } } +class QTableWidgetDataChanged : public QTableWidget +{ + Q_OBJECT +public: + using QTableWidget::QTableWidget; + + void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) override + { + QTableWidget::dataChanged(topLeft, bottomRight, roles); + currentRoles = roles; + } + QVector currentRoles; +}; + void tst_QTableWidget::itemData() { - QTableWidget widget(2, 2); + QTableWidgetDataChanged widget(2, 2); widget.setItem(0, 0, new QTableWidgetItem()); QTableWidgetItem *item = widget.item(0, 0); QVERIFY(item); item->setFlags(item->flags() | Qt::ItemIsEditable); item->setData(Qt::DisplayRole, QString("0")); + QCOMPARE(widget.currentRoles, QVector({Qt::DisplayRole, Qt::EditRole})); item->setData(Qt::CheckStateRole, Qt::PartiallyChecked); - item->setData(Qt::UserRole + 0, QString("1")); - item->setData(Qt::UserRole + 1, QString("2")); - item->setData(Qt::UserRole + 2, QString("3")); - item->setData(Qt::UserRole + 3, QString("4")); + QCOMPARE(widget.currentRoles, {Qt::CheckStateRole}); + for (int i = 0; i < 4; ++i) + { + item->setData(Qt::UserRole + i, QString::number(i + 1)); + QCOMPARE(widget.currentRoles, {Qt::UserRole + i}); + } QMap flags = widget.model()->itemData(widget.model()->index(0, 0)); QCOMPARE(flags.count(), 6); - QCOMPARE(flags[(Qt::UserRole + 0)].toString(), QString("1")); + for (int i = 0; i < 4; ++i) + QCOMPARE(flags[Qt::UserRole + i].toString(), QString::number(i + 1)); } void tst_QTableWidget::setItemData() -- cgit v1.2.3