From 5bab8448feb2661f871e71d71a95afaffcb1656a Mon Sep 17 00:00:00 2001 From: Christian Ehrlicher Date: Thu, 19 Dec 2024 21:23:24 +0100 Subject: [PATCH] QStandardItem: correctly set model during insertRows() When calling insertRows(), the model of the child items was not correctly updated. insertRow() is behaving correctly. Pick-to: 6.9 6.8 Fixes: QTBUG-131372 Change-Id: I8b6aef7ab97887c6eb46eb21b992d76e4d59b3a0 Reviewed-by: David Faure --- src/gui/itemmodels/qstandarditemmodel.cpp | 3 +- .../tst_qstandarditemmodel.cpp | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/gui/itemmodels/qstandarditemmodel.cpp b/src/gui/itemmodels/qstandarditemmodel.cpp index 91807ef7c42..0eb64c16957 100644 --- a/src/gui/itemmodels/qstandarditemmodel.cpp +++ b/src/gui/itemmodels/qstandarditemmodel.cpp @@ -450,8 +450,7 @@ bool QStandardItemPrivate::insertRows(int row, const QList &item } for (int i = 0; i < items.size(); ++i) { QStandardItem *item = items.at(i); - item->d_func()->model = model; - item->d_func()->parent = q; + item->d_func()->setParentAndModel(q, model); int index = childIndex(i + row, 0); children.replace(index, item); if (item) diff --git a/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp b/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp index ef2fd83d4ca..79b5c18e561 100644 --- a/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp +++ b/tests/auto/gui/itemmodels/qstandarditemmodel/tst_qstandarditemmodel.cpp @@ -68,6 +68,7 @@ private slots: void insertRow(); void insertRows(); void insertRowsItems(); + void insertRowsWithChildItems(); void insertRowInHierarcy(); void insertColumn_data(); void insertColumn(); @@ -296,6 +297,39 @@ void tst_QStandardItemModel::insertRowsItems() } } +void tst_QStandardItemModel::insertRowsWithChildItems() +{ + QStandardItemModel model; + auto *top = new QStandardItem("top"); + auto *mid = new QStandardItem("mid"); + auto *btm = new QStandardItem("bottom"); + + model.appendRow(top); + mid->appendRow(btm); + + QCOMPARE(top->model(), &model); + QCOMPARE(mid->model(), nullptr); + QCOMPARE(btm->model(), nullptr); + + top->appendRow(mid); + QCOMPARE(top->model(), &model); + QCOMPARE(mid->model(), &model); + QCOMPARE(btm->model(), &model); + + auto mid2 = top->takeChild(0); + top->removeRow(0); + QCOMPARE(mid, mid2); + QCOMPARE(top->model(), &model); + QCOMPARE(mid->model(), nullptr); + QCOMPARE(btm->model(), nullptr); + + top->appendRows({mid}); // other codepath than appendRow() above + QCOMPARE(top->model(), &model); + QCOMPARE(mid->model(), &model); + QCOMPARE(btm->model(), &model); +} + + void tst_QStandardItemModel::insertRowInHierarcy() { QVERIFY(m_model->insertRows(0, 1, QModelIndex()));