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() {