diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp index d1af4b2842..4b20a183ce 100644 --- a/src/widgets/dialogs/qmessagebox.cpp +++ b/src/widgets/dialogs/qmessagebox.cpp @@ -1556,6 +1556,23 @@ void QMessageBox::open(QObject *receiver, const char *member) QDialog::open(); } +void QMessageBox::setVisible(bool visible) +{ + if (testAttribute(Qt::WA_WState_ExplicitShowHide) && testAttribute(Qt::WA_WState_Hidden) != visible) + return; + + Q_D(QMessageBox); + if (d->canBeNativeDialog()) + d->setNativeDialogVisible(visible); + + // Update WA_DontShowOnScreen based on whether the native dialog was shown, + // so that QDialog::setVisible(visible) below updates the QWidget state correctly, + // but skips showing the non-native version. + setAttribute(Qt::WA_DontShowOnScreen, d->nativeDialogInUse); + + QDialog::setVisible(visible); +} + /*! \since 4.5 diff --git a/src/widgets/dialogs/qmessagebox.h b/src/widgets/dialogs/qmessagebox.h index 4b1f5118c8..5d75ffd842 100644 --- a/src/widgets/dialogs/qmessagebox.h +++ b/src/widgets/dialogs/qmessagebox.h @@ -113,6 +113,8 @@ public: using QDialog::open; void open(QObject *receiver, const char *member); + void setVisible(bool visible) override; + QList buttons() const; ButtonRole buttonRole(QAbstractButton *button) const;