Windows: Fix dialog moving up after closing/reshowing
A resize event delivered after closing the platform window was causing the stored frame margins to be cleared. Bail out of QWidgetWindow::updateMargins() if the platform window is null. Pick-to: 5.15 Fixes: QTBUG-79147 Change-Id: Iebbc90c3cccafa209cd720baedf45affb3f3c2b8 Reviewed-by: Richard Moe Gustavsen <richard.gustavsen@qt.io>bb10
parent
98a89fb711
commit
7f5d41e286
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
Loading…
Reference in New Issue