diff options
-rw-r--r-- | src/widgets/widgets/qmdisubwindow.cpp | 4 | ||||
-rw-r--r-- | tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp | 22 |
2 files changed, 25 insertions, 1 deletions
diff --git a/src/widgets/widgets/qmdisubwindow.cpp b/src/widgets/widgets/qmdisubwindow.cpp index c3b31ea5a4..7129c2ff44 100644 --- a/src/widgets/widgets/qmdisubwindow.cpp +++ b/src/widgets/widgets/qmdisubwindow.cpp @@ -1000,7 +1000,9 @@ void QMdiSubWindowPrivate::removeBaseWidget() q->setWindowModified(false); } lastChildWindowTitle.clear(); - baseWidget->setParent(0); + // QTBUG-47993: parent widget can be reset before this call + if (baseWidget->parentWidget() == q) + baseWidget->setParent(0); baseWidget = 0; isWidgetHiddenByUs = false; } diff --git a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp index a6caa3d020..acdf5b00e2 100644 --- a/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp +++ b/tests/auto/widgets/widgets/qmdisubwindow/tst_qmdisubwindow.cpp @@ -201,6 +201,7 @@ private slots: void task_226929(); void styleChange(); void testFullScreenState(); + void testRemoveBaseWidget(); }; void tst_QMdiSubWindow::initTestCase() @@ -2064,6 +2065,27 @@ void tst_QMdiSubWindow::testFullScreenState() QCOMPARE(subWindow->size(), QSize(300, 300)); } +void tst_QMdiSubWindow::testRemoveBaseWidget() +{ + QMdiArea mdiArea; + mdiArea.show(); + + QWidget *widget1 = new QWidget; + mdiArea.addSubWindow(widget1); + + QWidget *widget2 = new QWidget; + mdiArea.addSubWindow(widget2); + + mdiArea.removeSubWindow(widget1); + QVERIFY(!widget1->parent()); + + widget2->setParent(widget1); + mdiArea.removeSubWindow(widget2); + QCOMPARE(widget2->parent(), widget1); + + delete widget1; +} + QTEST_MAIN(tst_QMdiSubWindow) #include "tst_qmdisubwindow.moc" |