aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCristian Maureira-Fredes <cristian.maureira-fredes@qt.io>2020-03-25 11:45:21 +0100
committerCristian Maureira-Fredes <cristian.maureira-fredes@qt.io>2020-03-25 13:39:11 +0100
commit502dfcf352b0094e2b1e8b495af1cdeb3e7874ed (patch)
tree5077ff833096f762abbe6348a581a7f8df249973
parent308aba2154699596e3fd0973501213423462a80b (diff)
Invert QTreeWidgetItem clear function loop
When using clear on an item with children, we rely on the childCount() function so when children with only a parent and no local reference were inside, they ended up being removed, altering the behavior of the loop. Change-Id: I111a600cd2e805eeb7110082437e666f88ff65a5 Fixes: PYSIDE-1251 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
-rw-r--r--sources/pyside2/PySide2/glue/qtwidgets.cpp10
1 files changed, 9 insertions, 1 deletions
diff --git a/sources/pyside2/PySide2/glue/qtwidgets.cpp b/sources/pyside2/PySide2/glue/qtwidgets.cpp
index 1c663364c..4f9baadf1 100644
--- a/sources/pyside2/PySide2/glue/qtwidgets.cpp
+++ b/sources/pyside2/PySide2/glue/qtwidgets.cpp
@@ -413,7 +413,15 @@ for (auto *item : items) {
// @snippet qtreewidget-clear
QTreeWidgetItem *rootItem = %CPPSELF.invisibleRootItem();
Shiboken::BindingManager &bm = Shiboken::BindingManager::instance();
-for (int i = 0, i_count = rootItem->childCount(); i < i_count; ++i) {
+
+// PYSIDE-1251:
+// Since some objects can be created with a parent and without
+// being saved on a local variable (refcount = 1), they will be
+// deleted when setting the parent to nullptr, so we change the loop
+// to do this from the last child to the first, to avoid the case
+// when the child(1) points to the original child(2) in case the
+// first one was removed.
+for (int i = rootItem->childCount() - 1; i >= 0; --i) {
QTreeWidgetItem *item = rootItem->child(i);
if (SbkObject *wrapper = bm.retrieveWrapper(item))
Shiboken::Object::setParent(nullptr, reinterpret_cast<PyObject *>(wrapper));