summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLuca Beldi <v.ronin@yahoo.it>2021-05-11 10:24:43 +0100
committerLuca Beldi <v.ronin@yahoo.it>2021-05-11 18:55:09 +0100
commit811a6c6b77a94d86e28a0b00079e02a863391108 (patch)
tree795e4b166480f413160acbe85c2523b8e116f894 /src
parent0bbccfe001e005fb83ae0a9633bf11c4b3e25ce1 (diff)
Fix QStandardItemModel signals on takeChild
takeItem and takeChild do not signal the change correctly to the external world, this change fixes the problem Fixes: QTBUG-89145 Pick-to: 6.1 5.15 Change-Id: Ib4844ace53007068a2cd62eba64df99e6e45fdc0 Reviewed-by: David Faure <david.faure@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/gui/itemmodels/qstandarditemmodel.cpp29
1 files changed, 27 insertions, 2 deletions
diff --git a/src/gui/itemmodels/qstandarditemmodel.cpp b/src/gui/itemmodels/qstandarditemmodel.cpp
index a972b7b106..675b71c530 100644
--- a/src/gui/itemmodels/qstandarditemmodel.cpp
+++ b/src/gui/itemmodels/qstandarditemmodel.cpp
@@ -1893,10 +1893,35 @@ QStandardItem *QStandardItem::takeChild(int row, int column)
QStandardItem *item = nullptr;
int index = d->childIndex(row, column);
if (index != -1) {
+ QModelIndex changedIdx;
item = d->children.at(index);
- if (item)
- item->d_func()->setParentAndModel(nullptr, nullptr);
+ if (item && d->model) {
+ QStandardItemPrivate *const item_d = item->d_func();
+ const int savedRows = item_d->rows;
+ const int savedCols = item_d->columns;
+ const QVector<QStandardItem*> savedChildren = item_d->children;
+ if (savedRows > 0) {
+ d->model->d_func()->rowsAboutToBeRemoved(item, 0, savedRows - 1);
+ item_d->rows = 0;
+ item_d->children = QVector<QStandardItem*>(); //slightly faster than clear
+ d->model->d_func()->rowsRemoved(item, 0, savedRows);
+ }
+ if (savedCols > 0) {
+ d->model->d_func()->columnsAboutToBeRemoved(item, 0, savedCols - 1);
+ item_d->columns = 0;
+ if (!item_d->children.isEmpty())
+ item_d->children = QVector<QStandardItem*>(); //slightly faster than clear
+ d->model->d_func()->columnsRemoved(item, 0, savedCols);
+ }
+ item_d->rows = savedRows;
+ item_d->columns = savedCols;
+ item_d->children = savedChildren;
+ changedIdx = d->model->indexFromItem(item);
+ item_d->setParentAndModel(nullptr, nullptr);
+ }
d->children.replace(index, nullptr);
+ if (changedIdx.isValid())
+ d->model->dataChanged(changedIdx, changedIdx);
}
return item;
}