diff options
-rw-r--r-- | src/widgets/kernel/qwidgetwindow.cpp | 6 | ||||
-rw-r--r-- | tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp | 22 |
2 files changed, 27 insertions, 1 deletions
diff --git a/src/widgets/kernel/qwidgetwindow.cpp b/src/widgets/kernel/qwidgetwindow.cpp index ae1e461d7a..cdc358aca2 100644 --- a/src/widgets/kernel/qwidgetwindow.cpp +++ b/src/widgets/kernel/qwidgetwindow.cpp @@ -736,8 +736,12 @@ bool QWidgetWindow::updateSize() void QWidgetWindow::updateMargins() { - const QMargins margins = frameMargins(); + // QTBUG-79147 (Windows): Bail out on resize events after closing a dialog + // and destroying the platform window which would clear the margins. QTLWExtra *te = m_widget->d_func()->topData(); + if (te->window == nullptr || te->window->handle() == nullptr) + return; + const QMargins margins = frameMargins(); te->posIncludesFrame= false; te->frameStrut.setCoords(margins.left(), margins.top(), margins.right(), margins.bottom()); m_widget->data->fstrut_dirty = false; diff --git a/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp b/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp index 9ef64480d6..53c33255bf 100644 --- a/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp +++ b/tests/auto/widgets/dialogs/qdialog/tst_qdialog.cpp @@ -80,6 +80,7 @@ private slots: void transientParent_data(); void transientParent(); void dialogInGraphicsView(); + void keepPositionOnClose(); }; // Testing get/set functions @@ -543,5 +544,26 @@ void tst_QDialog::dialogInGraphicsView() } } +// QTBUG-79147 (Windows): Closing a dialog by clicking the 'X' in the title +// bar would offset the dialog position when shown next time. +void tst_QDialog::keepPositionOnClose() +{ + QDialog dialog; + dialog.setWindowTitle(QTest::currentTestFunction()); + const QRect availableGeometry = QGuiApplication::primaryScreen()->availableGeometry(); + dialog.resize(availableGeometry.size() / 4); + const QPoint pos = availableGeometry.topLeft() + QPoint(100, 100); + dialog.move(pos); + dialog.show(); + QVERIFY(QTest::qWaitForWindowExposed(&dialog)); + dialog.close(); + dialog.windowHandle()->destroy(); // Emulate a click on close by destroying the window. + QTest::qWait(50); + dialog.show(); + QVERIFY(QTest::qWaitForWindowExposed(&dialog)); + QTest::qWait(50); + QCOMPARE(dialog.pos(), pos); +} + QTEST_MAIN(tst_QDialog) #include "tst_qdialog.moc" |