From 96e3c2bcbfedc8b5cb8fc099229a02a1fa335c21 Mon Sep 17 00:00:00 2001 From: Volker Krause Date: Mon, 8 Apr 2013 14:14:32 +0200 Subject: [PATCH] Don't bypass overwritten [set]data() methods in the proxy. By calling itemData() of the source model directly, the result cannot contain data provided by the proxy model itself. The base class implementation however will call data() on the proxy instead. Change-Id: Ib0ef5f5621457adbfa4bd896a756dfcb98d0ae54 Reviewed-by: Stephen Kelly --- .../itemmodels/qabstractproxymodel.cpp | 6 ++--- .../tst_qidentityproxymodel.cpp | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/src/corelib/itemmodels/qabstractproxymodel.cpp b/src/corelib/itemmodels/qabstractproxymodel.cpp index 0e1764ba7cd..d435c4bcf54 100644 --- a/src/corelib/itemmodels/qabstractproxymodel.cpp +++ b/src/corelib/itemmodels/qabstractproxymodel.cpp @@ -272,8 +272,7 @@ QVariant QAbstractProxyModel::headerData(int section, Qt::Orientation orientatio */ QMap QAbstractProxyModel::itemData(const QModelIndex &proxyIndex) const { - Q_D(const QAbstractProxyModel); - return d->model->itemData(mapToSource(proxyIndex)); + return QAbstractItemModel::itemData(proxyIndex); } /*! @@ -299,8 +298,7 @@ bool QAbstractProxyModel::setData(const QModelIndex &index, const QVariant &valu */ bool QAbstractProxyModel::setItemData(const QModelIndex &index, const QMap< int, QVariant >& roles) { - Q_D(QAbstractProxyModel); - return d->model->setItemData(mapToSource(index), roles); + return QAbstractItemModel::setItemData(index, roles); } /*! diff --git a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp index f750b7a9d4c..ea0a14c18c7 100644 --- a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp +++ b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp @@ -79,6 +79,8 @@ private slots: void reset(); void dataChanged(); + void itemData(); + protected: void verifyIdentity(QAbstractItemModel *model, const QModelIndex &parent = QModelIndex()); @@ -364,5 +366,29 @@ void tst_QIdentityProxyModel::dataChanged() m_proxy->setSourceModel(0); } +class AppendStringProxy : public QIdentityProxyModel +{ +public: + QVariant data(const QModelIndex &index, int role) const + { + const QVariant result = sourceModel()->data(index, role); + if (role != Qt::DisplayRole) + return result; + return result.toString() + "_appended"; + } +}; + +void tst_QIdentityProxyModel::itemData() +{ + QStringListModel model(QStringList() << "Monday" << "Tuesday" << "Wednesday"); + AppendStringProxy proxy; + proxy.setSourceModel(&model); + + const QModelIndex topIndex = proxy.index(0, 0); + QCOMPARE(topIndex.data(Qt::DisplayRole).toString(), QStringLiteral("Monday_appended")); + QCOMPARE(proxy.data(topIndex, Qt::DisplayRole).toString(), QStringLiteral("Monday_appended")); + QCOMPARE(proxy.itemData(topIndex).value(Qt::DisplayRole).toString(), QStringLiteral("Monday_appended")); +} + QTEST_MAIN(tst_QIdentityProxyModel) #include "tst_qidentityproxymodel.moc"