diff --git a/src/widgets/kernel/qwidget.cpp b/src/widgets/kernel/qwidget.cpp index a8bc8e2185a..0cfd3ca93cc 100644 --- a/src/widgets/kernel/qwidget.cpp +++ b/src/widgets/kernel/qwidget.cpp @@ -153,6 +153,7 @@ QWidgetPrivate::QWidgetPrivate(int version) , usesRhiFlush(0) , childrenHiddenByWState(0) , childrenShownByExpose(0) + , dontSetExplicitShowHide(0) #if defined(Q_OS_WIN) , noPaintOnScreen(0) #endif @@ -8291,8 +8292,12 @@ void QWidget::setVisible(bool visible) if (testAttribute(Qt::WA_WState_ExplicitShowHide) && testAttribute(Qt::WA_WState_Hidden) == !visible) return; - // Remember that setVisible was called explicitly - setAttribute(Qt::WA_WState_ExplicitShowHide); + if (d->dontSetExplicitShowHide) { + d->dontSetExplicitShowHide = false; + } else { + // Remember that setVisible was called explicitly + setAttribute(Qt::WA_WState_ExplicitShowHide); + } d->setVisible(visible); } @@ -8446,10 +8451,17 @@ void QWidgetPrivate::showChildren(bool spontaneous) QShowEvent e; QApplication::sendSpontaneousEvent(widget, &e); } else { - if (widget->testAttribute(Qt::WA_WState_ExplicitShowHide)) + if (widget->testAttribute(Qt::WA_WState_ExplicitShowHide)) { widget->d_func()->show_recursive(); - else - widget->d_func()->setVisible(true); + } else { + // Call QWidget::setVisible() here, so that subclasses + // that (wrongly) override setVisible to do initialization + // will still be notified that they are made visible, but + // do so without triggering ExplicitShowHide. + widget->d_func()->dontSetExplicitShowHide = true; + widget->setVisible(true); + widget->d_func()->dontSetExplicitShowHide = false; + } } } } diff --git a/src/widgets/kernel/qwidget_p.h b/src/widgets/kernel/qwidget_p.h index 9fab9efa62b..b27ffdb1be6 100644 --- a/src/widgets/kernel/qwidget_p.h +++ b/src/widgets/kernel/qwidget_p.h @@ -733,6 +733,7 @@ public: uint usesRhiFlush : 1; uint childrenHiddenByWState : 1; uint childrenShownByExpose : 1; + uint dontSetExplicitShowHide : 1; // *************************** Focus abstraction ************************************ enum class FocusDirection {