diff options
-rw-r--r-- | src/quick/items/qquickwindow.h | 1 | ||||
-rw-r--r-- | src/quickwidgets/qquickwidget.cpp | 31 | ||||
-rw-r--r-- | tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp | 4 |
3 files changed, 21 insertions, 15 deletions
diff --git a/src/quick/items/qquickwindow.h b/src/quick/items/qquickwindow.h index 79e8a11aa8..53fe0a4c4b 100644 --- a/src/quick/items/qquickwindow.h +++ b/src/quick/items/qquickwindow.h @@ -241,6 +241,7 @@ private: friend class QQuickWidget; friend class QQuickRenderControl; friend class QQuickAnimatorController; + friend class QQuickWidgetPrivate; Q_DISABLE_COPY(QQuickWindow) }; diff --git a/src/quickwidgets/qquickwidget.cpp b/src/quickwidgets/qquickwidget.cpp index a098c94670..f1a0f0c863 100644 --- a/src/quickwidgets/qquickwidget.cpp +++ b/src/quickwidgets/qquickwidget.cpp @@ -76,6 +76,18 @@ QT_BEGIN_NAMESPACE +// override setVisble to prevent accidental offscreen window being created +// by base class. +class QQuickOffcreenWindowPrivate: public QQuickWindowPrivate { +public: + void setVisible(bool visible) override { + Q_Q(QWindow); + // this stays always invisible + visibility = visible ? QWindow::Windowed : QWindow::Hidden; + q->visibilityChanged(visibility); // workaround for QTBUG-49054 + } +}; + class QQuickWidgetRenderControl : public QQuickRenderControl { public: @@ -94,7 +106,7 @@ void QQuickWidgetPrivate::init(QQmlEngine* e) Q_Q(QQuickWidget); renderControl = new QQuickWidgetRenderControl(q); - offscreenWindow = new QQuickWindow(renderControl); + offscreenWindow = new QQuickWindow(*new QQuickOffcreenWindowPrivate(),renderControl); offscreenWindow->setTitle(QString::fromLatin1("Offscreen")); // Do not call create() on offscreenWindow. @@ -1321,12 +1333,9 @@ void QQuickWidget::showEvent(QShowEvent *) triggerUpdate(); } } - QWindowPrivate *offscreenPrivate = QWindowPrivate::get(d->offscreenWindow); - if (!offscreenPrivate->visible) { - offscreenPrivate->visible = true; - emit d->offscreenWindow->visibleChanged(true); - offscreenPrivate->updateVisibility(); - } + + // note offscreenWindow is "QQuickOffScreenWindow" instance + d->offscreenWindow->setVisible(true); if (QQmlInspectorService *service = QQmlDebugConnector::service<QQmlInspectorService>()) service->setParentWindow(d->offscreenWindow, window()->windowHandle()); } @@ -1337,12 +1346,8 @@ void QQuickWidget::hideEvent(QHideEvent *) Q_D(QQuickWidget); if (!d->offscreenWindow->isPersistentSceneGraph()) d->invalidateRenderControl(); - QWindowPrivate *offscreenPrivate = QWindowPrivate::get(d->offscreenWindow); - if (offscreenPrivate->visible) { - offscreenPrivate->visible = false; - emit d->offscreenWindow->visibleChanged(false); - offscreenPrivate->updateVisibility(); - } + // note offscreenWindow is "QQuickOffScreenWindow" instance + d->offscreenWindow->setVisible(false); if (QQmlInspectorService *service = QQmlDebugConnector::service<QQmlInspectorService>()) service->setParentWindow(d->offscreenWindow, d->offscreenWindow); } diff --git a/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp b/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp index aaf37b32cd..fd5c3653ad 100644 --- a/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp +++ b/tests/auto/quickwidgets/qquickwidget/tst_qquickwidget.cpp @@ -161,7 +161,7 @@ void tst_qquickwidget::showHide() window.show(); QVERIFY(QTest::qWaitForWindowExposed(&window)); - QVERIFY(childView->quickWindow()->isVisible()); + QVERIFY(!childView->quickWindow()->isVisible()); // this window is always not visible see QTBUG-65761 QVERIFY(childView->quickWindow()->visibility() != QWindow::Hidden); window.hide(); @@ -612,7 +612,7 @@ void tst_qquickwidget::synthMouseFromTouch() childView->resize(300, 300); window.show(); QVERIFY(QTest::qWaitForWindowActive(&window)); - QVERIFY(childView->quickWindow()->isVisible()); + QVERIFY(!childView->quickWindow()->isVisible()); // this window is always not visible see QTBUG-65761 QVERIFY(item->isVisible()); QPoint p1 = QPoint(20, 20); |