From 6841dd6eccda88f08ad4c424fc9d5f9e400aaf43 Mon Sep 17 00:00:00 2001 From: aavit Date: Tue, 21 Oct 2014 12:21:06 +0200 Subject: QGraphicsScene: stabilize stacking order of toplevel items Removing and adding toplevel items could result in invalid stacking order (not corresponding to insertion order). Task-number: QTBUG-19316 Change-Id: Ia8646784a2181cfa936b101e2adaf7e7e73bb83d Reviewed-by: Andreas Aardal Hanssen --- src/widgets/graphicsview/qgraphicsscene.cpp | 2 +- .../qgraphicsscene/tst_qgraphicsscene.cpp | 37 ++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/widgets/graphicsview/qgraphicsscene.cpp b/src/widgets/graphicsview/qgraphicsscene.cpp index ae3eb1eee7..988152da9d 100644 --- a/src/widgets/graphicsview/qgraphicsscene.cpp +++ b/src/widgets/graphicsview/qgraphicsscene.cpp @@ -392,7 +392,7 @@ void QGraphicsScenePrivate::_q_emitUpdated() */ void QGraphicsScenePrivate::registerTopLevelItem(QGraphicsItem *item) { - item->d_ptr->ensureSequentialSiblingIndex(); + ensureSequentialTopLevelSiblingIndexes(); needSortTopLevelItems = true; // ### maybe false item->d_ptr->siblingIndex = topLevelItems.size(); topLevelItems.append(item); diff --git a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp index 70448f9813..bd1c6a0dc5 100644 --- a/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicsscene/tst_qgraphicsscene.cpp @@ -242,6 +242,7 @@ private slots: void style(); void sorting_data(); void sorting(); + void insertionOrder(); void changedSignal_data(); void changedSignal(); void stickyFocus_data(); @@ -3633,6 +3634,42 @@ void tst_QGraphicsScene::sorting() << t_1); } +void tst_QGraphicsScene::insertionOrder() +{ + QGraphicsScene scene; + const int numItems = 5; + QList items; + + for (int i = 0; i < numItems; ++i) { + QGraphicsRectItem* item = new QGraphicsRectItem(i * 20, i * 20, 200, 200); + item->setData(0, i); + items.append(item); + scene.addItem(item); + } + + { + QList itemList = scene.items(); + QCOMPARE(itemList.count(), numItems); + for (int i = 0; i < itemList.count(); ++i) { + QCOMPARE(numItems-1-i, itemList.at(i)->data(0).toInt()); + } + } + + for (int i = 0; i < items.size(); ++i) + { + scene.removeItem(items.at(i)); + scene.addItem(items.at(i)); + } + + { + QList itemList = scene.items(); + QCOMPARE(itemList.count(), numItems); + for (int i = 0; i < itemList.count(); ++i) { + QCOMPARE(numItems-1-i, itemList.at(i)->data(0).toInt()); + } + } +} + class ChangedListener : public QObject { Q_OBJECT -- cgit v1.2.3