From eb1a6263ce7035124f758ba9f8a5e2bcd83afbc4 Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Mon, 11 Sep 2023 12:25:00 +0200 Subject: [PATCH] QDockWidget: ignore close event if DockWidgetClosable is not set MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [ChangeLog][QtWidgets][QDockWidget] A floating dockwidget that doesn't have the DockWidgetClosable feature flag set can no longer be closed by a call to QWidget::close or a corresponding keyboard shortcut (such as Alt+F4). Fixes: QTBUG-116752 Pick-to: 6.5 Change-Id: I7859a2eed11f0e4ee013f7f56611e282e9bcae9a Reviewed-by: Santhosh Kumar Reviewed-by: Doris Verria Reviewed-by: Qt CI Bot Reviewed-by: Tor Arne Vestbø (cherry picked from commit 6c90aa029bb65dc5357ac7a26738e711c97732a2) Reviewed-by: Qt Cherry-pick Bot --- src/widgets/widgets/qdockwidget.cpp | 8 +++++++- .../widgets/qdockwidget/tst_qdockwidget.cpp | 19 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/widgets/widgets/qdockwidget.cpp b/src/widgets/widgets/qdockwidget.cpp index fe0feeed125..b6576ed131f 100644 --- a/src/widgets/widgets/qdockwidget.cpp +++ b/src/widgets/widgets/qdockwidget.cpp @@ -1531,7 +1531,13 @@ void QDockWidget::closeEvent(QCloseEvent *event) Q_D(QDockWidget); if (d->state) d->endDrag(true); - QWidget::closeEvent(event); + + // For non-closable widgets, don't allow closing, except when the mainwindow + // is hidden, as otherwise an application wouldn't be able to be shut down. + const QMainWindow *win = qobject_cast(parentWidget()); + const bool canClose = (d->features & DockWidgetClosable) + || (!win || !win->isVisible()); + event->setAccepted(canClose); } /*! \reimp */ diff --git a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp index 61f8bf995bc..45a8296d5e7 100644 --- a/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp +++ b/tests/auto/widgets/widgets/qdockwidget/tst_qdockwidget.cpp @@ -73,6 +73,7 @@ private slots: // test closing and deleting consistency void closeAndDelete(); + void closeUnclosable(); // test save and restore consistency void saveAndRestore(); @@ -1585,6 +1586,24 @@ void tst_QDockWidget::closeAndDelete() #endif // QT_BUILD_INTERNAL } +void tst_QDockWidget::closeUnclosable() +{ + QDockWidget *dockWidget = new QDockWidget("dock"); + dockWidget->setWidget(new QScrollArea); + dockWidget->setFeatures(QDockWidget::DockWidgetFloatable); + + QMainWindow mw; + mw.addDockWidget(Qt::TopDockWidgetArea, dockWidget); + mw.show(); + + QVERIFY(QTest::qWaitForWindowExposed(&mw)); + dockWidget->setFloating(true); + + QCOMPARE(dockWidget->close(), false); + mw.close(); + QCOMPARE(dockWidget->close(), true); +} + // Test dock area permissions void tst_QDockWidget::dockPermissions() {