diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-06-14 15:38:47 +0200 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2022-06-14 19:18:52 +0000 |
commit | 153b69333d568944cf8e96eb4a17228c91c7c2db (patch) | |
tree | 7cdd11eaabd118d81a589c70660b78daff6fe2fd | |
parent | b0b1dc9576c942c642ee81deb14e6e350d56a661 (diff) |
Fix QStatusBar with widgets disappearing from QMainWindow
There is code that redirects QStatusBar messages to IOleInPlaceFrame.
It should not trigger when the statusbar has widgets. Add a helper function
to check this.
Fixes: QTBUG-99294
Change-Id: I6854f3774bc6c31e6f184cc5b677419867011326
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
(cherry picked from commit 428f20048a8b2648626a510c5f2c1d27ac8b273b)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/activeqt/control/qaxserverbase.cpp | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/activeqt/control/qaxserverbase.cpp b/src/activeqt/control/qaxserverbase.cpp index 99623ef..35f3127 100644 --- a/src/activeqt/control/qaxserverbase.cpp +++ b/src/activeqt/control/qaxserverbase.cpp @@ -68,6 +68,7 @@ #include <qmetaobject.h> #include <qpixmap.h> #include <qregularexpression.h> +#include <qsizegrip.h> #include <qstatusbar.h> #include <qwhatsthis.h> #include <ocidl.h> @@ -3783,6 +3784,25 @@ HRESULT WINAPI QAxServerBase::Close(DWORD dwSaveOption) bool qax_disable_inplaceframe = true; +// Find a status bar to hook into, hide and redirect its messages to +// IOleInPlaceFrame if and only if the user did not explicitly show it or +// added some widgets (QTBUG-99294). +static QStatusBar *findStatusBar(QWidget *w) +{ + if (w == nullptr) + return nullptr; + QStatusBar *result = w->findChild<QStatusBar*>(); + if (result == nullptr) + return nullptr; + if (result->isVisible() && result->testAttribute(Qt::WA_WState_ExplicitShowHide)) + return nullptr; + for (auto child : result->children()) { + if (child->isWidgetType() && qobject_cast<QSizeGrip *>(child) == nullptr) + return nullptr; + } + return result; +} + /* Executes the steps to activate the control. */ @@ -3865,8 +3885,7 @@ HRESULT QAxServerBase::internalActivate() menuBar->hide(); menuBar->installEventFilter(this); } - statusBar = qt.widget ? qt.widget->findChild<QStatusBar*>() : nullptr; - if (statusBar && !statusBar->isVisible()) { + if (auto *statusBar = findStatusBar(qt.widget)) { const int index = statusBar->metaObject()->indexOfSignal("messageChanged(QString)"); QMetaObject::connect(statusBar, index, this, STATUSBAR_MESSAGE_CHANGED_SLOT_INDEX); statusBar->hide(); |