From 8455bfee76ed3f1bd3bba8bd3688a7afa94ae0bb Mon Sep 17 00:00:00 2001 From: Wang ChunLin Date: Fri, 23 Oct 2020 11:02:30 +0800 Subject: Fix QSFPM not emitting dataChanged when source model is set QSortFilterProxyModel did not emit dataChanged when calling setSourceModel() after modifying the source model. QSortFilterProxyModel::setSourceModel and QSortFilterProxyModelPrivate::_q_sourceReset(), _q_clearMapping is called to delete the source_index_mapping. They also need to call create_mapping function to re-create it. Fixes: QTBUG-87781 Pick-to: 5.15 Change-Id: Idbe34696c9d3a2fbf354b653c870bac61378811d Reviewed-by: Volker Hilsheimer --- .../tst_qsortfilterproxymodel.cpp | 29 ++++++++++++++++++++++ .../tst_qsortfilterproxymodel.h | 1 + 2 files changed, 30 insertions(+) (limited to 'tests/auto/corelib/itemmodels') diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp index 20fc5d492d..44da534246 100644 --- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp +++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp @@ -2163,6 +2163,35 @@ void tst_QSortFilterProxyModel::changeSourceDataForwardsRoles_qtbug35440() QCOMPARE(spy.at(1).at(2).value >(), expectedChangedRoles); } +void tst_QSortFilterProxyModel::changeSourceDataProxySendDataChanged_qtbug87781() +{ + QStandardItemModel baseModel; + QSortFilterProxyModel proxyModelBefore; + QSortFilterProxyModel proxyModelAfter; + + QSignalSpy baseDataChangedSpy(&baseModel, &QStandardItemModel::dataChanged); + QSignalSpy beforeDataChangedSpy(&proxyModelBefore, &QSortFilterProxyModel::dataChanged); + QSignalSpy afterDataChangedSpy(&proxyModelAfter, &QSortFilterProxyModel::dataChanged); + + QVERIFY(baseDataChangedSpy.isValid()); + QVERIFY(beforeDataChangedSpy.isValid()); + QVERIFY(afterDataChangedSpy.isValid()); + + proxyModelBefore.setSourceModel(&baseModel); + baseModel.insertRows(0, 1); + baseModel.insertColumns(0, 1); + proxyModelAfter.setSourceModel(&baseModel); + + QCOMPARE(baseDataChangedSpy.size(), 0); + QCOMPARE(beforeDataChangedSpy.size(), 0); + QCOMPARE(afterDataChangedSpy.size(), 0); + + baseModel.setData(baseModel.index(0, 0), QStringLiteral("new data"), Qt::DisplayRole); + QCOMPARE(baseDataChangedSpy.size(), 1); + QCOMPARE(beforeDataChangedSpy.size(), 1); + QCOMPARE(afterDataChangedSpy.size(), 1); +} + void tst_QSortFilterProxyModel::sortFilterRole() { QStandardItemModel model; diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h index 68c00318fe..b0f4137082 100644 --- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h +++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h @@ -90,6 +90,7 @@ private slots: void changeSourceData(); void changeSourceDataKeepsStableSorting_qtbug1548(); void changeSourceDataForwardsRoles_qtbug35440(); + void changeSourceDataProxySendDataChanged_qtbug87781(); void resortingDoesNotBreakTreeModels(); void dynamicFilterWithoutSort(); void sortFilterRole(); -- cgit v1.2.3