QMessageBox: Set clicked button for native dialogs in clicked callback

For non-native dialogs we set the clicked button before calling finalize,
which emits finished(). We did the same for custom buttons in native
dialogs, but for standard buttons in native dialogs we deferred it
until QMessageBoxPrivate::helperDone, which meant that during the
finished() signal the button was not set.

We now set the button as early as possible for all three cases.

Pick-to: 6.6 6.5
Change-Id: Ifdbaa9a25105fef0bb56dd28caee9af55cd74e67
Reviewed-by: Volker Hilsheimer <volker.hilsheimer@qt.io>
This commit is contained in:
Tor Arne Vestbø 2023-06-28 15:03:11 +02:00
parent 49ce711796
commit cd9ae49962

View File

@ -239,7 +239,6 @@ public:
private:
void initHelper(QPlatformDialogHelper *) override;
void helperPrepareShow(QPlatformDialogHelper *) override;
void helperDone(QDialog::DialogCode, QPlatformDialogHelper *) override;
};
void QMessageBoxPrivate::init(const QString &title, const QString &text)
@ -510,6 +509,8 @@ void QMessageBoxPrivate::_q_clicked(QPlatformDialogHelper::StandardButton button
clickedButton->click();
q->done(role);
} else {
clickedButton = q->button(QMessageBox::StandardButton(button));
Q_ASSERT(clickedButton);
q->done(button);
}
}
@ -2837,16 +2838,6 @@ void QMessageBoxPrivate::helperPrepareShow(QPlatformDialogHelper *)
options->setCheckBox(checkbox->text(), checkbox->checkState());
}
void QMessageBoxPrivate::helperDone(QDialog::DialogCode code, QPlatformDialogHelper *)
{
Q_Q(QMessageBox);
QAbstractButton *button = q->button(QMessageBox::StandardButton(code));
// If it was a custom button, a custom ID was used, so we won't get a valid pointer here.
// In that case, clickedButton has already been set in _q_buttonClicked.
if (button)
clickedButton = button;
}
void qRequireVersion(int argc, char *argv[], QAnyStringView req)
{
const auto required = QVersionNumber::fromString(req).normalized();