aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/quick/items/qquickwindowmodule.cpp20
-rw-r--r--tests/auto/quick/qquickwindow/data/active.qml2
-rw-r--r--tests/auto/quick/qquickwindow/data/windoworder.qml42
-rw-r--r--tests/auto/quick/qquickwindow/qquickwindow.pro3
-rw-r--r--tests/auto/quick/qquickwindow/tst_qquickwindow.cpp53
5 files changed, 116 insertions, 4 deletions
diff --git a/src/quick/items/qquickwindowmodule.cpp b/src/quick/items/qquickwindowmodule.cpp
index f6c32dcac3..3bd62d21db 100644
--- a/src/quick/items/qquickwindowmodule.cpp
+++ b/src/quick/items/qquickwindowmodule.cpp
@@ -73,7 +73,7 @@ public:
void setVisible(bool visible) {
if (!m_complete)
m_visible = visible;
- else
+ else if (!transientParent() || transientParent()->isVisible())
QQuickWindow::setVisible(visible);
}
@@ -101,6 +101,24 @@ protected:
void componentComplete() {
m_complete = true;
+ if (transientParent() && !transientParent()->isVisible()) {
+ connect(transientParent(), &QQuickWindow::visibleChanged, this,
+ &QQuickWindowQmlImpl::setWindowVisibility, Qt::QueuedConnection);
+ } else {
+ setWindowVisibility();
+ }
+ }
+
+private Q_SLOTS:
+ void setWindowVisibility()
+ {
+ if (transientParent() && !transientParent()->isVisible())
+ return;
+
+ if (sender()) {
+ disconnect(transientParent(), &QWindow::visibleChanged, this,
+ &QQuickWindowQmlImpl::setWindowVisibility);
+ }
// We have deferred window creation until we have the full picture of what
// the user wanted in terms of window state, geometry, visibility, etc.
diff --git a/tests/auto/quick/qquickwindow/data/active.qml b/tests/auto/quick/qquickwindow/data/active.qml
index af0b7edeb2..4d47225b4e 100644
--- a/tests/auto/quick/qquickwindow/data/active.qml
+++ b/tests/auto/quick/qquickwindow/data/active.qml
@@ -14,7 +14,6 @@ Window {
anchors.fill: parent;
onPressed: window2.requestActivate();
}
- Component.onCompleted: window2.show();
}
Window {
@@ -22,6 +21,7 @@ Window {
objectName: "window2";
color: "#FF0000";
width: 100; height: 100;
+ visible: true
Item {
width: 100; height: 100;
}
diff --git a/tests/auto/quick/qquickwindow/data/windoworder.qml b/tests/auto/quick/qquickwindow/data/windoworder.qml
new file mode 100644
index 0000000000..33aea95694
--- /dev/null
+++ b/tests/auto/quick/qquickwindow/data/windoworder.qml
@@ -0,0 +1,42 @@
+import QtQuick 2.1
+import QtQuick.Window 2.1
+
+Window {
+ id: window1;
+ objectName: "window1";
+ width: 100; height: 100;
+ visible: true
+ color: "blue"
+ property alias win2: window2
+ property alias win3: window3
+ property alias win4: window4
+ property alias win5: window5
+ Window {
+ id: window2;
+ objectName: "window2";
+ width: 100; height: 100;
+ visible: true
+ color: "green"
+ Window {
+ id: window3;
+ objectName: "window3";
+ width: 100; height: 100;
+ visible: true
+ }
+
+ Window { //Is invisible by default
+ id: window4
+ objectName: "window4";
+ height: 200
+ width: 200
+ color: "black"
+ Window {
+ id: window5
+ objectName: "window5";
+ height: 200
+ width: 200
+ visible: true
+ }
+ }
+ }
+}
diff --git a/tests/auto/quick/qquickwindow/qquickwindow.pro b/tests/auto/quick/qquickwindow/qquickwindow.pro
index 46cf96423f..6bce209df9 100644
--- a/tests/auto/quick/qquickwindow/qquickwindow.pro
+++ b/tests/auto/quick/qquickwindow/qquickwindow.pro
@@ -14,6 +14,7 @@ OTHER_FILES += \
data/active.qml \
data/AnimationsWhileHidden.qml \
data/Headless.qml \
- data/showHideAnimate.qml
+ data/showHideAnimate.qml \
+ data/windoworder.qml
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0
diff --git a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
index fcab0c7ef2..b05146fa3a 100644
--- a/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
+++ b/tests/auto/quick/qquickwindow/tst_qquickwindow.cpp
@@ -341,6 +341,8 @@ private slots:
void requestActivate();
+ void testWindowVisibilityOrder();
+
void blockClosing();
void crashWhenHoverItemDeleted();
@@ -1589,7 +1591,8 @@ void tst_qquickwindow::requestActivate()
QVERIFY(windows.at(0)->objectName() == "window2");
window1->show();
- window1->requestActivate();
+ QVERIFY(QTest::qWaitForWindowExposed(windows.at(0))); //We wait till window 2 comes up
+ window1->requestActivate(); // and then transfer the focus to window1
QTRY_VERIFY(QGuiApplication::focusWindow() == window1);
QVERIFY(window1->isActive() == true);
@@ -1615,6 +1618,54 @@ void tst_qquickwindow::requestActivate()
QTRY_VERIFY(QGuiApplication::focusWindow() == windows.at(0));
QVERIFY(windows.at(0)->isActive());
+ delete window1;
+}
+
+void tst_qquickwindow::testWindowVisibilityOrder()
+{
+ QQmlEngine engine;
+ QQmlComponent component(&engine);
+ component.loadUrl(testFileUrl("windoworder.qml"));
+ QQuickWindow *window1 = qobject_cast<QQuickWindow *>(component.create());
+ QQuickWindow *window2 = window1->property("win2").value<QQuickWindow*>();
+ QQuickWindow *window3 = window1->property("win3").value<QQuickWindow*>();
+ QQuickWindow *window4 = window1->property("win4").value<QQuickWindow*>();
+ QQuickWindow *window5 = window1->property("win5").value<QQuickWindow*>();
+ QVERIFY(window1);
+ QVERIFY(window2);
+ QVERIFY(window3);
+
+ QTest::qWaitForWindowExposed(window3);
+
+ QWindowList windows = QGuiApplication::topLevelWindows();
+ QTRY_COMPARE(windows.size(), 5);
+
+ QVERIFY(window3 == QGuiApplication::focusWindow());
+ QVERIFY(window1->isActive());
+ QVERIFY(window2->isActive());
+ QVERIFY(window3->isActive());
+
+ //Test if window4 is shown 2 seconds after the application startup
+ //with window4 visible window5 (transient child) should also become visible
+ QVERIFY(!window4->isVisible());
+ QVERIFY(!window5->isVisible());
+
+ window4->setVisible(true);
+
+ QTest::qWaitForWindowExposed(window5);
+ QVERIFY(window4->isVisible());
+ QVERIFY(window5->isVisible());
+ window4->hide();
+ window5->hide();
+
+ window3->hide();
+#if defined(Q_OS_OSX)
+ QEXPECT_FAIL("","Focus is not transferred to transient parent on window close (QTBUG-33423)", Continue);
+#endif
+ QTRY_COMPARE(window2 == QGuiApplication::focusWindow(), true);
+
+ window2->hide();
+ QTRY_COMPARE(window1 == QGuiApplication::focusWindow(), true);
}
void tst_qquickwindow::blockClosing()