From 4d644342addfa2bc03ded458ae06c71a840bcc56 Mon Sep 17 00:00:00 2001 From: David Faure Date: Tue, 10 Jun 2025 15:23:15 +0200 Subject: [PATCH] QIdentityProxyModel: avoid emitting reset in no-op setSourceModel QSortFilterProxyModel does this exactly, it was missing in QIdentityProxyModel. Change-Id: If14bc7a377c1ad9235dd70222e3bfbf88eef11c0 Reviewed-by: Santhosh Kumar (cherry picked from commit 5e971101f016e6e7d015594c539612e770e2999d) Reviewed-by: Qt Cherry-pick Bot --- src/corelib/itemmodels/qidentityproxymodel.cpp | 7 +++++-- .../qidentityproxymodel/tst_qidentityproxymodel.cpp | 13 +++++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/corelib/itemmodels/qidentityproxymodel.cpp b/src/corelib/itemmodels/qidentityproxymodel.cpp index 069878e1123..1a97dd5b05d 100644 --- a/src/corelib/itemmodels/qidentityproxymodel.cpp +++ b/src/corelib/itemmodels/qidentityproxymodel.cpp @@ -291,10 +291,13 @@ QVariant QIdentityProxyModel::headerData(int section, Qt::Orientation orientatio */ void QIdentityProxyModel::setSourceModel(QAbstractItemModel* newSourceModel) { - beginResetModel(); - Q_D(QIdentityProxyModel); + if (newSourceModel == d->model) + return; + + beginResetModel(); + // Call QObject::disconnect() unconditionally, if there is an existing source // model, it's disconnected, and if there isn't, then calling disconnect() on // a default-constructed Connection does nothing diff --git a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp index 72f71d3d046..c99242c927b 100644 --- a/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp +++ b/tests/auto/corelib/itemmodels/qidentityproxymodel/tst_qidentityproxymodel.cpp @@ -357,10 +357,19 @@ void tst_QIdentityProxyModel::reset() resetCommand.doCommand(); } - QVERIFY(modelBeforeSpy.size() == 1 && 1 == proxyBeforeSpy.size()); - QVERIFY(modelAfterSpy.size() == 1 && 1 == proxyAfterSpy.size()); + QCOMPARE(modelBeforeSpy.size(), 1); + QCOMPARE(modelAfterSpy.size(), 1); + QCOMPARE(proxyBeforeSpy.size(), 1); + QCOMPARE(proxyAfterSpy.size(), 1); verifyIdentity(&model); + + // setSourceModel again shouldn't emit reset + m_proxy->setSourceModel(&model); + + QCOMPARE(proxyBeforeSpy.size(), 1); + QCOMPARE(proxyAfterSpy.size(), 1); + m_proxy->setSourceModel(0); }