Forward QCloseEvent to the MDI widgets too

Fixes case where docked MDI widgets were not able to block a close

(cherry-picked from commit 61cca1e5ec)
This commit is contained in:
Sergio Martins
2022-06-19 00:56:42 +01:00
parent 30f43d7579
commit f8b1745c68
2 changed files with 36 additions and 0 deletions

View File

@@ -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);
}

View File

@@ -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<Controllers::MainWindow> 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();