diff --git a/src/corelib/itemmodels/qsortfilterproxymodel.cpp b/src/corelib/itemmodels/qsortfilterproxymodel.cpp index ac4f62619f5..7dcc68b4393 100644 --- a/src/corelib/itemmodels/qsortfilterproxymodel.cpp +++ b/src/corelib/itemmodels/qsortfilterproxymodel.cpp @@ -2112,6 +2112,13 @@ void QSortFilterProxyModel::setSourceModel(QAbstractItemModel *sourceModel) QObjectPrivate::connect(d->model, &QAbstractItemModel::modelReset, d, &QSortFilterProxyModelPrivate::_q_sourceReset) }; + /* check whether we are connecting to a model that is undergoing a reset currently. + If it is, _q_sourceReset will take care of calling endResetModel, and of + calling sort if necessary. + */ + auto modelPrivate = d->model ? QAbstractItemModelPrivate::get(d->model) : nullptr; + if (modelPrivate && modelPrivate->resetting) + return; endResetModel(); if (d->update_source_sort_column() && d->dynamic_sortfilter) d->sort(); diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp index 4d21fcbb593..350609c05ed 100644 --- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp +++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.cpp @@ -3663,6 +3663,18 @@ void tst_QSortFilterProxyModel::resetInvalidate() QCOMPARE(ok, works); } +void tst_QSortFilterProxyModel::sourceModelInReset() +{ + QTest::failOnWarning(); + QStandardItemModel m1; + QSortFilterProxyModel sfpm; + connect(&m1, &QAbstractItemModel::modelAboutToBeReset, &sfpm, [&]() { + sfpm.setSourceModel(&m1); + }); + m1.clear(); + QCOMPARE_EQ(sfpm.sourceModel(), &m1); +} + /** * A proxy which changes the background color for items ending in 'y' or 'r' */ diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.h b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.h index 78d06f32dab..e91fae84042 100644 --- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.h +++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel/tst_qsortfilterproxymodel.h @@ -104,6 +104,7 @@ private slots: void unnecessaryMapCreation(); void resetInvalidate_data(); void resetInvalidate(); + void sourceModelInReset(); void testMultipleProxiesWithSelection(); void mapSelectionFromSource();