diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index 426a9d717f..8a472a4f0a 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -241,7 +241,7 @@ void QQuickWidgetPrivate::handleWindowChange() // must be recreated because its RHI will contain a dangling pointer to // the context. - delete offscreenWindow; + QScopedPointer oldOffScreenWindow(offscreenWindow); // Do not delete before reparenting sgItem offscreenWindow = nullptr; delete renderControl; diff --git a/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp b/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp index 8316625d87..c203366980 100644 --- a/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp +++ b/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include @@ -135,6 +136,7 @@ private slots: #if QT_CONFIG(graphicsview) void focusOnClickInProxyWidget(); #endif + void focusPreserved(); private: QPointingDevice *device = QTest::createTouchDevice(); @@ -939,6 +941,49 @@ void tst_qquickwidget::focusOnClickInProxyWidget() } #endif +void tst_qquickwidget::focusPreserved() +{ + if (!QGuiApplicationPrivate::platformIntegration()->hasCapability(QPlatformIntegration::WindowActivation)) + QSKIP("Window Activation is not supported."); + if (QGuiApplication::platformName() == "android") + QSKIP("Test doesn't exit cleanly on Android and generates many warnings - QTBUG-112696"); + + QScopedPointer widget(new QWidget()); + QScopedPointer quick(new QQuickWidget()); + QQuickItem *root = new QQuickItem(); // will be owned by quick after setContent + QScopedPointer content(new QQuickItem()); + content->setActiveFocusOnTab(true); + content->setFocus(true); + quick->setFocusPolicy(Qt::StrongFocus); + quick->setContent(QUrl(), nullptr, root); + root->setFlag(QQuickItem::ItemHasContents); + content->setParentItem(root); + + quick->setGeometry(0, 0, 200, 200); + quick->show(); + quick->setFocus(); + quick->activateWindow(); + QVERIFY(QTest::qWaitForWindowExposed(quick.get())); + QTRY_VERIFY(quick->hasFocus()); + QTRY_VERIFY(content->hasFocus()); + QTRY_VERIFY(content->hasActiveFocus()); + + widget->show(); + widget->setFocus(); + widget->activateWindow(); + QVERIFY(QTest::qWaitForWindowExposed(widget.get())); + QTRY_VERIFY(widget->hasFocus()); + + quick->setParent(widget.get()); + + quick->show(); + quick->setFocus(); + quick->activateWindow(); + QTRY_VERIFY(quick->hasFocus()); + QTRY_VERIFY(content->hasFocus()); + QTRY_VERIFY(content->hasActiveFocus()); +} + QTEST_MAIN(tst_qquickwidget) #include "tst_qquickwidget.moc"