From c27d2a57a441f9a1ce760e71635bd4c96882249d Mon Sep 17 00:00:00 2001 From: Luca Beldi Date: Tue, 19 Oct 2021 10:34:33 +0100 Subject: [PATCH] Make QAbstractProxyModel itemData() behave like data() QAbstractProxyModel::itemData/setItemData should behave just like data()/setData() instead of calling the QAbstractItemModel implementation. Before this change the QAbstractProxyModel implementation calls its the QAbstractItemModel implementation, which ends up calling data()/setData() in a loop bypassing the convenience of itemData/setItemData. [ChangeLog][QtCore][QAbstractProxyModel] The itemData() and setItemData() functions will now call the respective implementations in the source model (after mapping the index to a source index), matching what data() and setData() already did. Before, the proxy model simply called the default implementations of itemData()/setItemData() in its own base class (QAbstractItemModel). Change-Id: I9e680d355f44fa130660dd7e1c8ac37484c1566e Reviewed-by: David Faure --- src/corelib/itemmodels/qabstractproxymodel.cpp | 6 ++++-- .../qidentityproxymodel/tst_qidentityproxymodel.cpp | 11 ++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/corelib/itemmodels/qabstractproxymodel.cpp b/src/corelib/itemmodels/qabstractproxymodel.cpp index 39fe44464cb..d8a93eee369 100644 --- a/src/corelib/itemmodels/qabstractproxymodel.cpp +++ b/src/corelib/itemmodels/qabstractproxymodel.cpp @@ -268,7 +268,8 @@ QVariant QAbstractProxyModel::headerData(int section, Qt::Orientation orientatio */ QMap QAbstractProxyModel::itemData(const QModelIndex &proxyIndex) const { - return QAbstractItemModel::itemData(proxyIndex); + Q_D(const QAbstractProxyModel); + return d->model->itemData(mapToSource(proxyIndex)); } /*! @@ -294,7 +295,8 @@ bool QAbstractProxyModel::setData(const QModelIndex &index, const QVariant &valu */ bool QAbstractProxyModel::setItemData(const QModelIndex &index, const QMap< int, QVariant >& roles) { - return QAbstractItemModel::setItemData(index, roles); + Q_D(QAbstractProxyModel); + return d->model->setItemData(mapToSource(index), roles); } /*! diff --git a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp index 3f93938ed98..72f35647464 100644 --- a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp +++ b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp @@ -404,8 +404,17 @@ public: const QVariant result = QIdentityProxyModel::data(index, role); if (role != Qt::DisplayRole) return result; - return result.toString() + "_appended"; + return result.toString() + QLatin1String("_appended"); } + QMap itemData(const QModelIndex &index) const override + { + QMap result = QIdentityProxyModel::itemData(index); + auto displayIter = result.find(Qt::DisplayRole); + if (displayIter != result.end()) + displayIter.value() = displayIter.value().toString() + QLatin1String("_appended"); + return result; + } + }; void tst_QIdentityProxyModel::itemData()