summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-06-14 15:38:47 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-06-14 19:18:52 +0000
commit153b69333d568944cf8e96eb4a17228c91c7c2db (patch)
tree7cdd11eaabd118d81a589c70660b78daff6fe2fd
parentb0b1dc9576c942c642ee81deb14e6e350d56a661 (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.cpp23
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();