From f8b1745c68c53d7c60395df36cb23daeafdec6ec Mon Sep 17 00:00:00 2001 From: Sergio Martins Date: Sun, 19 Jun 2022 00:56:42 +0100 Subject: [PATCH] Forward QCloseEvent to the MDI widgets too Fixes case where docked MDI widgets were not able to block a close (cherry-picked from commit 61cca1e5eccbd9de4197033b51bed4056b5c38f7) --- src/qtwidgets/views/MDIArea_qtwidgets.cpp | 6 +++++ tests/qtwidgets/tst_qtwidgets.cpp | 30 +++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/src/qtwidgets/views/MDIArea_qtwidgets.cpp b/src/qtwidgets/views/MDIArea_qtwidgets.cpp index bb6ac2a3..55d4a956 100644 --- a/src/qtwidgets/views/MDIArea_qtwidgets.cpp +++ b/src/qtwidgets/views/MDIArea_qtwidgets.cpp @@ -11,6 +11,8 @@ #include "MDIArea_qtwidgets.h" +#include "private/View_p.h" + #include "kddockwidgets/ViewFactory.h" #include "kddockwidgets/views/DockWidgetViewInterface.h" #include "kddockwidgets/controllers/DockWidget.h" @@ -50,6 +52,10 @@ MDIArea_qtwidgets::MDIArea_qtwidgets(QWidget *parent) auto vlay = new QVBoxLayout(this); vlay->addWidget(View_qtwidgets::asQWidget(d->layout)); + View::d->closeRequested.connect([this](QCloseEvent *ev) { + d->layout->onCloseEvent(ev); + }); + // TODOm3: for qtquick: // QWidgetAdapter::makeItemFillParent(d->layout); } diff --git a/tests/qtwidgets/tst_qtwidgets.cpp b/tests/qtwidgets/tst_qtwidgets.cpp index 564cf962..48d3577f 100644 --- a/tests/qtwidgets/tst_qtwidgets.cpp +++ b/tests/qtwidgets/tst_qtwidgets.cpp @@ -135,6 +135,7 @@ private Q_SLOTS: void tst_mdi_mixed_with_docking_setMDISize(); void tst_deleteOnClose(); void tstCloseNestedMdi(); + void tstCloseNestedMDIPropagates(); // But these are fine to be widget only: void tst_tabsNotClickable(); @@ -1510,6 +1511,35 @@ void TestQtWidgets::tstCloseNestedMdi() QVERIFY(m->isVisible()); } +void TestQtWidgets::tstCloseNestedMDIPropagates() +{ + auto m = createMainWindow(QSize(1000, 500), MainWindowOption_HasCentralWidget); + QPointer p = m.get(); + + auto mdi = new KDDockWidgets::Views::MDIArea_qtwidgets(); + m->setPersistentCentralView(mdi->asWrapper()); + + auto dock1 = new KDDockWidgets::Views::DockWidget_qtwidgets(QStringLiteral("MyDock1")); + auto nonClosableWidget = Platform::instance()->tests_createNonClosableView(); + dock1->dockWidget()->setGuestView(nonClosableWidget->asWrapper()); + mdi->addDockWidget(dock1, {}); + + auto dock2 = new KDDockWidgets::Views::DockWidget_qtwidgets(QStringLiteral("MyDock2")); + auto nonClosableWidget2 = Platform::instance()->tests_createNonClosableView(); + dock2->dockWidget()->setGuestView(nonClosableWidget2->asWrapper()); + dock2->show(); + + Platform::instance()->tests_waitForEvent(dock1->controller(), QEvent::Show); + QVERIFY(dock1->isVisible()); + QVERIFY(dock2->isVisible()); + + m->close(); + + QVERIFY(dock2->isVisible()); + QVERIFY(dock1->isVisible()); +} + + void TestQtWidgets::initTestCase() { KDDockWidgets::Platform::instance()->installMessageHandler();