QItemSelectionModel: don't warn when destroying the model
Amends 4f4a8e75ab
, after which
QItemSelectionModel printed a warning when destroying the model.
We reset the selection model in response to the model getting destroyed,
and since the model is already set to be nullptr at this point the
select() function complains about changing the selection with no model
set being a no-op.
Fix this by not calling reset() when the model gets destroyed - the
stored selection and currentIndex are already reset at this point -
and instead only call reset() when a new model is set in initModel.
Fixes: QTBUG-117200
Pick-to: 6.6.0 6.6 6.5 6.2
Change-Id: I12fc6b3fb2f2ff2a34b46988d5f58151123f9976
Reviewed-by: Axel Spoerl <axel.spoerl@qt.io>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
This commit is contained in:
parent
52a5a89ea4
commit
dc126de22e
@ -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();
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -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"
|
||||
|
Loading…
Reference in New Issue
Block a user