diff options
-rw-r--r-- | src/widgets/graphicsview/qgraphicsscene.cpp | 9 | ||||
-rw-r--r-- | tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp | 18 |
2 files changed, 27 insertions, 0 deletions
diff --git a/src/widgets/graphicsview/qgraphicsscene.cpp b/src/widgets/graphicsview/qgraphicsscene.cpp index 8a0b983c73..88cccb5118 100644 --- a/src/widgets/graphicsview/qgraphicsscene.cpp +++ b/src/widgets/graphicsview/qgraphicsscene.cpp @@ -637,6 +637,15 @@ void QGraphicsScenePrivate::removeItemHelper(QGraphicsItem *item) if (item == lastActivePanel) lastActivePanel = 0; + // Change tabFocusFirst to the next widget in focus chain if removing the current one. + if (item == tabFocusFirst) { + QGraphicsWidgetPrivate *wd = tabFocusFirst->d_func(); + if (wd->focusNext && wd->focusNext != tabFocusFirst && wd->focusNext->scene() == q) + tabFocusFirst = wd->focusNext; + else + tabFocusFirst = 0; + } + // Cancel active touches { QMap<int, QGraphicsItem *>::iterator it = itemForTouchPointId.begin(); diff --git a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp index 08a10aa593..2bb588afed 100644 --- a/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp +++ b/tests/auto/widgets/graphicsview/qgraphicswidget/tst_qgraphicswidget.cpp @@ -1696,6 +1696,24 @@ void tst_QGraphicsWidget::verifyFocusChain() delete w; } { + // QTBUG-30923: + // Child QGraphicsWidget with tabFocusFirst gets removed & deleted should not crash. + // This case simulates what QtQuick1 does when you have QGraphicsObject based + // item in different qml views that are loaded one after another. + QGraphicsItem *parent1 = new QGraphicsRectItem(0); // root item + scene.addItem(parent1); + for (int i = 0; i < 2; i++) { + SubQGraphicsWidget *w1 = new SubQGraphicsWidget(parent1); + w1->setFocusPolicy(Qt::StrongFocus); + w1->setFocus(); + QVERIFY(w1->hasFocus()); + scene.removeItem(w1); + delete w1; + QApplication::processEvents(); + } + delete parent1; + } + { // remove the tabFocusFirst widget from the scene. QWidget *window = new QWidget; QVBoxLayout *layout = new QVBoxLayout; |