diff options
-rw-r--r-- | src/corelib/itemmodels/qitemselectionmodel.cpp | 6 | ||||
-rw-r--r-- | tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp | 17 |
2 files changed, 20 insertions, 3 deletions
diff --git a/src/corelib/itemmodels/qitemselectionmodel.cpp b/src/corelib/itemmodels/qitemselectionmodel.cpp index ad36ecfbf6..67868b19e1 100644 --- a/src/corelib/itemmodels/qitemselectionmodel.cpp +++ b/src/corelib/itemmodels/qitemselectionmodel.cpp @@ -555,8 +555,10 @@ void QItemSelectionModelPrivate::initModel(QAbstractItemModel *m) if (oldModel == m) return; - if (oldModel) + if (oldModel) { + q->reset(); disconnectModel(); + } // Caller has to call notify(), unless calling during construction (the common case). model.setValueBypassingBindings(m); @@ -593,12 +595,10 @@ void QItemSelectionModelPrivate::initModel(QAbstractItemModel *m) void QItemSelectionModelPrivate::disconnectModel() { - Q_Q(QItemSelectionModel); for (auto &connection : connections) { QObject::disconnect(connection); connection = QMetaObject::Connection(); } - q->reset(); } /*! diff --git a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp index a14336e119..eeb72f5301 100644 --- a/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp +++ b/tests/auto/corelib/itemmodels/qitemselectionmodel/tst_qitemselectionmodel.cpp @@ -81,6 +81,7 @@ private slots: void QTBUG93305(); void testSignalsDisconnection(); + void destroyModel(); private: static void messageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg); @@ -2952,5 +2953,21 @@ void tst_QItemSelectionModel::testSignalsDisconnection() QVERIFY(!signalError); } +void tst_QItemSelectionModel::destroyModel() +{ + auto itemModel = std::make_unique<QStandardItemModel>(5, 5); + auto selectionModel = std::make_unique<QItemSelectionModel>(); + selectionModel->setModel(itemModel.get()); + selectionModel->select(itemModel->index(0, 0), QItemSelectionModel::Select); + QVERIFY(!selectionModel->selection().isEmpty()); + selectionModel->setCurrentIndex(itemModel->index(1, 0), QItemSelectionModel::Select); + QVERIFY(selectionModel->currentIndex().isValid()); + + QTest::failOnWarning(QRegularExpression(".*")); + itemModel.reset(); + QVERIFY(!selectionModel->currentIndex().isValid()); + QVERIFY(selectionModel->selection().isEmpty()); +} + QTEST_MAIN(tst_QItemSelectionModel) #include "tst_qitemselectionmodel.moc" |