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); }