diff options
author | Luca Beldi <v.ronin@yahoo.it> | 2021-05-11 10:24:43 +0100 |
---|---|---|
committer | Luca Beldi <v.ronin@yahoo.it> | 2021-05-11 18:55:09 +0100 |
commit | 811a6c6b77a94d86e28a0b00079e02a863391108 (patch) | |
tree | 795e4b166480f413160acbe85c2523b8e116f894 /src | |
parent | 0bbccfe001e005fb83ae0a9633bf11c4b3e25ce1 (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.cpp | 29 |
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; } |