diff --git a/src/gui/kernel/qwindow.cpp b/src/gui/kernel/qwindow.cpp index cd3af8598dd..ea8c0be35e9 100644 --- a/src/gui/kernel/qwindow.cpp +++ b/src/gui/kernel/qwindow.cpp @@ -2125,6 +2125,11 @@ void QWindowPrivate::destroy() resizeEventPending = true; receivedExpose = false; exposed = false; + + // Position set via setFramePosition will have propagated back to + // our geometry member as client geometry, so when creating the + // window again we need to ensure the policy matches that. + positionPolicy = QWindowPrivate::WindowFrameExclusive; } /*! diff --git a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp index 23f99dad5f9..bf214cead5c 100644 --- a/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp +++ b/tests/auto/gui/kernel/qwindow/tst_qwindow.cpp @@ -47,6 +47,7 @@ private slots: void positioning(); void framePositioning(); void framePositioning_data(); + void framePositioningStableAfterDestroy(); void positioningDuringMinimized(); void childWindowPositioning_data(); void childWindowPositioning(); @@ -666,6 +667,23 @@ void tst_QWindow::framePositioning() QTRY_COMPARE(screenCenterAdjusted, window.position()); } +void tst_QWindow::framePositioningStableAfterDestroy() +{ + QWindow window; + window.setFramePosition(QPoint(100, 100)); + window.show(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); + + const QPoint stablePosition = window.position(); + const QPoint stableFramePosition = window.framePosition(); + + window.destroy(); + window.show(); + QVERIFY(QTest::qWaitForWindowExposed(&window)); + QCOMPARE(window.position(), stablePosition); + QCOMPARE(window.framePosition(), stableFramePosition); +} + void tst_QWindow::positioningDuringMinimized() { // QTBUG-39544, setting a geometry in minimized state should work as well.