Cocoa MessageBox: don't use native message box if detailed text is set

As per the documentation: A message box displays a primary
text to alert the user to a situation, an informative text to
further explain the situation, and an optional detailed text to provide
even more data if the user requests it.

The AppKit NSAlert doesn't provide such a "detailed" section, and our
code just added this "even more data" detailed text to the primary text.

This breaks the UI when the detailed text is very long, perhaps a
complete log output with dozens or even hundreds of lines of text.

Since NSAlert doesn't provide a "details" space, fall-back to the non-
native message box if detailed text is provided.

[ChangeLog][QtWidgets][QMessageBox] On Apple platforms, the native
message box is no longer used when detailed text is set.

Pick-to: 6.5
Fixes: QTBUG-118992
Change-Id: I6f4764ceb8f8e57d641c0b0660223a9c26f5bd26
Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@qt.io>
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
(cherry picked from commit 8753bb3045d020bcae33eed67a2770a4709ac7b8)
This commit is contained in:
Volker Hilsheimer 2023-11-09 12:27:37 +02:00
parent 1d80626400
commit 89dd5ab630

View File

@ -91,6 +91,12 @@ bool QCocoaMessageDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality w
if (!options())
return false;
// NSAlert doesn't have a section for detailed text
if (!options()->detailedText().isEmpty()) {
qCWarning(lcQpaDialogs, "Message box contains detailed text");
return false;
}
if (Qt::mightBeRichText(options()->text()) ||
Qt::mightBeRichText(options()->informativeText())) {
// Let's fallback to non-native message box,
@ -103,10 +109,7 @@ bool QCocoaMessageDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality w
m_alert = [NSAlert new];
m_alert.window.title = options()->windowTitle().toNSString();
QString text = toPlainText(options()->text());
QString details = toPlainText(options()->detailedText());
if (!details.isEmpty())
text += u"\n\n"_s + details;
const QString text = toPlainText(options()->text());
m_alert.messageText = text.toNSString();
m_alert.informativeText = toPlainText(options()->informativeText()).toNSString();