From cb465195f1a11f5eebe2be0c8eae8e41aaff93bb Mon Sep 17 00:00:00 2001 From: Axel Spoerl Date: Tue, 14 Nov 2023 09:41:54 +0100 Subject: [PATCH] QDockWidget: Always show dock widgets with the main window QMainWindow::show() also showed its dock widget children. When a main window with dock widget children consumed a show event for another reason, hidden dock widget children remained hidden. If a dock widget application went to the background, e.g. because it was hidden behind another application gaining focus, a klick on the dock widget application's app icon would not show its dock widget children. Unless the dock widget application provides shows them explicitly, they can never been shown again by the user. => show all dock widget and group window children, when QMainWindow consumes a show event. Pick-to: 6.5 Change-Id: I7e8b59f021ec4ec5679d0d08d0eeda1e3225a385 Reviewed-by: David Faure (cherry picked from commit 4c60a11d8f935abb762a83b0ab99cefa6db3060c) Reviewed-by: Qt Cherry-pick Bot --- src/widgets/widgets/qmainwindow.cpp | 7 +++++++ src/widgets/widgets/qmainwindowlayout.cpp | 11 +++++++++++ src/widgets/widgets/qmainwindowlayout_p.h | 1 + 3 files changed, 19 insertions(+) diff --git a/src/widgets/widgets/qmainwindow.cpp b/src/widgets/widgets/qmainwindow.cpp index fcf6d56c0c4..662c9db8928 100644 --- a/src/widgets/widgets/qmainwindow.cpp +++ b/src/widgets/widgets/qmainwindow.cpp @@ -1290,6 +1290,13 @@ bool QMainWindow::event(QEvent *event) return true; #endif // QT_CONFIG(statustip) +#if QT_CONFIG(dockwidget) + case QEvent::Show: + Q_ASSERT(d->layout); + d->layout->showDockWidgets(); + break; +#endif // QT_CONFIG(dockwidget) + case QEvent::StyleChange: #if QT_CONFIG(dockwidget) Q_ASSERT(d->layout); diff --git a/src/widgets/widgets/qmainwindowlayout.cpp b/src/widgets/widgets/qmainwindowlayout.cpp index 99357a83514..7aeab159ddf 100644 --- a/src/widgets/widgets/qmainwindowlayout.cpp +++ b/src/widgets/widgets/qmainwindowlayout.cpp @@ -1494,6 +1494,17 @@ inline static Qt::DockWidgetArea toDockWidgetArea(int pos) return QDockWidgetPrivate::toDockWidgetArea(static_cast(pos)); } +void QMainWindowLayout::showDockWidgets() const +{ + const auto dockWidgets = parent()->findChildren(Qt::FindDirectChildrenOnly); + for (auto *dockWidget : dockWidgets) + dockWidget->show(); + + const auto groupWindows = parent()->findChildren(Qt::FindDirectChildrenOnly); + for (auto *groupWindow : groupWindows) + groupWindow->show(); +} + // Checks if QDockWidgetGroupWindow or QDockWidget can be plugged the area indicated by path. // Returns false if called with invalid widget type or if compiled without dockwidget support. #if QT_CONFIG(dockwidget) diff --git a/src/widgets/widgets/qmainwindowlayout_p.h b/src/widgets/widgets/qmainwindowlayout_p.h index 44ecb08e204..154b2b17c06 100644 --- a/src/widgets/widgets/qmainwindowlayout_p.h +++ b/src/widgets/widgets/qmainwindowlayout_p.h @@ -502,6 +502,7 @@ public: Qt::Orientation orientation); Qt::DockWidgetArea dockWidgetArea(QWidget* widget) const; bool restoreDockWidget(QDockWidget *dockwidget); + void showDockWidgets() const; #if QT_CONFIG(tabbar) void tabifyDockWidget(QDockWidget *first, QDockWidget *second); void raise(QDockWidget *widget);