diff --git a/src/widgets/kernel/qwidget_qpa.cpp b/src/widgets/kernel/qwidget_qpa.cpp index 39f8aa944d..4c65d08b6a 100644 --- a/src/widgets/kernel/qwidget_qpa.cpp +++ b/src/widgets/kernel/qwidget_qpa.cpp @@ -526,21 +526,23 @@ void QWidget::setWindowState(Qt::WindowStates newstate) Qt::WindowState oldEffectiveState = effectiveState(oldstate); if (isWindow() && newEffectiveState != oldEffectiveState) { d->createTLExtra(); - if (oldEffectiveState == Qt::WindowNoState) { //normal + if (oldEffectiveState == Qt::WindowNoState) d->topData()->normalGeometry = geometry(); - } else if (oldEffectiveState == Qt::WindowFullScreen) { - setParent(0, d->topData()->savedFlags); - needShow = true; - } else if (oldEffectiveState == Qt::WindowMinimized) { - needShow = true; - } Q_ASSERT(windowHandle()); windowHandle()->setWindowState(newEffectiveState); bool supported = windowHandle()->windowState() == newEffectiveState; if (!supported) { - // emulate the window state + // undo the effects of the old emulated state + if (oldEffectiveState == Qt::WindowFullScreen) { + setParent(0, d->topData()->savedFlags); + needShow = true; + } else if (oldEffectiveState == Qt::WindowMinimized) { + needShow = true; + } + + // emulate the new window state if (newEffectiveState == Qt::WindowMinimized) { //### not ideal... hide(); diff --git a/tests/auto/qwidget/tst_qwidget.cpp b/tests/auto/qwidget/tst_qwidget.cpp index 99b069487f..1414123296 100644 --- a/tests/auto/qwidget/tst_qwidget.cpp +++ b/tests/auto/qwidget/tst_qwidget.cpp @@ -1829,67 +1829,93 @@ void tst_QWidget::windowState() widget1.setWindowState(Qt::WindowMaximized); QTest::qWait(100); VERIFY_STATE(Qt::WindowMaximized); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMaximized); widget1.show(); QTest::qWait(100); VERIFY_STATE(Qt::WindowMaximized); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMaximized); widget1.setWindowState(widget1.windowState() ^ Qt::WindowMaximized); QTest::qWait(100); QVERIFY(!(widget1.windowState() & Qt::WindowMaximized)); - QCOMPARE(widget1.pos(), pos); + QTRY_COMPARE(widget1.pos(), pos); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowNoState); widget1.setWindowState(Qt::WindowMinimized); QTest::qWait(100); VERIFY_STATE(Qt::WindowMinimized); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMinimized); widget1.setWindowState(widget1.windowState() | Qt::WindowMaximized); QTest::qWait(100); VERIFY_STATE((Qt::WindowMinimized|Qt::WindowMaximized)); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMinimized); widget1.setWindowState(widget1.windowState() ^ Qt::WindowMinimized); QTest::qWait(100); VERIFY_STATE(Qt::WindowMaximized); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMaximized); widget1.setWindowState(widget1.windowState() ^ Qt::WindowMaximized); QTest::qWait(100); QVERIFY(!(widget1.windowState() & (Qt::WindowMinimized|Qt::WindowMaximized))); - QCOMPARE(widget1.pos(), pos); + QTRY_COMPARE(widget1.pos(), pos); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowNoState); widget1.setWindowState(Qt::WindowFullScreen); QTest::qWait(100); VERIFY_STATE(Qt::WindowFullScreen); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowFullScreen); widget1.setWindowState(widget1.windowState() ^ Qt::WindowMinimized); QTest::qWait(100); VERIFY_STATE((Qt::WindowFullScreen|Qt::WindowMinimized)); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMinimized); widget1.setWindowState(widget1.windowState() ^ Qt::WindowMinimized); QTest::qWait(100); VERIFY_STATE(Qt::WindowFullScreen); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowFullScreen); + + widget1.setWindowState(Qt::WindowNoState); + QTest::qWait(100); + VERIFY_STATE(Qt::WindowNoState); + QTRY_COMPARE(widget1.pos(), pos); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowNoState); + + widget1.setWindowState(Qt::WindowFullScreen); + QTest::qWait(100); + VERIFY_STATE(Qt::WindowFullScreen); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowFullScreen); widget1.setWindowState(widget1.windowState() ^ Qt::WindowMaximized); QTest::qWait(100); VERIFY_STATE((Qt::WindowFullScreen|Qt::WindowMaximized)); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowFullScreen); widget1.setWindowState(widget1.windowState() ^ Qt::WindowMinimized); QTest::qWait(100); VERIFY_STATE((Qt::WindowFullScreen|Qt::WindowMaximized|Qt::WindowMinimized)); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMinimized); widget1.setWindowState(widget1.windowState() ^ Qt::WindowMinimized); QTest::qWait(100); VERIFY_STATE((Qt::WindowFullScreen|Qt::WindowMaximized)); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowFullScreen); widget1.setWindowState(widget1.windowState() ^ Qt::WindowFullScreen); QTest::qWait(100); VERIFY_STATE(Qt::WindowMaximized); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowMaximized); widget1.setWindowState(widget1.windowState() ^ Qt::WindowMaximized); QTest::qWait(100); QVERIFY(!(widget1.windowState() & stateMask)); + QCOMPARE(widget1.windowHandle()->windowState(), Qt::WindowNoState); - QCOMPARE(widget1.pos(), pos); - QCOMPARE(widget1.size(), size); + QTRY_COMPARE(widget1.pos(), pos); + QTRY_COMPARE(widget1.size(), size); #endif }