diff --git a/src/gui/kernel/qplatformdialoghelper.cpp b/src/gui/kernel/qplatformdialoghelper.cpp index 0224fb2c61..fbc635cc93 100644 --- a/src/gui/kernel/qplatformdialoghelper.cpp +++ b/src/gui/kernel/qplatformdialoghelper.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include @@ -774,6 +775,7 @@ public: QPlatformDialogHelper::StandardButtons buttons; QList customButtons; int nextCustomButtonId; + QPixmap iconPixmap; }; QMessageDialogOptions::QMessageDialogOptions(QMessageDialogOptionsPrivate *dd) @@ -825,6 +827,16 @@ void QMessageDialogOptions::setIcon(Icon icon) d->icon = icon; } +void QMessageDialogOptions::setIconPixmap(const QPixmap &pixmap) +{ + d->iconPixmap = pixmap; +} + +QPixmap QMessageDialogOptions::iconPixmap() const +{ + return d->iconPixmap; +} + QString QMessageDialogOptions::text() const { return d->text; diff --git a/src/gui/kernel/qplatformdialoghelper.h b/src/gui/kernel/qplatformdialoghelper.h index 83857ba82e..2d3138270f 100644 --- a/src/gui/kernel/qplatformdialoghelper.h +++ b/src/gui/kernel/qplatformdialoghelper.h @@ -416,6 +416,9 @@ public: void setIcon(Icon icon); Icon icon() const; + void setIconPixmap(const QPixmap &pixmap); + QPixmap iconPixmap() const; + void setText(const QString &text); QString text() const; diff --git a/src/plugins/platforms/cocoa/qcocoamessagedialog.mm b/src/plugins/platforms/cocoa/qcocoamessagedialog.mm index c21fbc2ce4..3d3970953d 100644 --- a/src/plugins/platforms/cocoa/qcocoamessagedialog.mm +++ b/src/plugins/platforms/cocoa/qcocoamessagedialog.mm @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -90,8 +91,18 @@ bool QCocoaMessageDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality w m_alert.messageText = text.toNSString(); m_alert.informativeText = toPlainText(options()->informativeText()).toNSString(); - switch (options()->icon()) { - case QMessageDialogOptions::NoIcon: + switch (auto standardIcon = options()->icon()) { + case QMessageDialogOptions::NoIcon: { + // We only reflect the pixmap icon if the standard icon is unset, + // as setting a standard icon will also set a corresponding pixmap + // icon, which we don't want since it conflicts with the platform. + // If the user has set an explicit pixmap icon however, the standard + // icon will be NoIcon, so we're good. + QPixmap iconPixmap = options()->iconPixmap(); + if (!iconPixmap.isNull()) + m_alert.icon = [NSImage imageFromQImage:iconPixmap.toImage()]; + break; + } case QMessageDialogOptions::Information: case QMessageDialogOptions::Question: [m_alert setAlertStyle:NSAlertStyleInformational]; @@ -104,8 +115,6 @@ bool QCocoaMessageDialog::show(Qt::WindowFlags windowFlags, Qt::WindowModality w break; } - // FIXME: Propagate iconPixmap through dialog options - bool defaultButtonAdded = false; bool cancelButtonAdded = false; diff --git a/src/widgets/dialogs/qmessagebox.cpp b/src/widgets/dialogs/qmessagebox.cpp index 95aaf45e7c..52a6d9282e 100644 --- a/src/widgets/dialogs/qmessagebox.cpp +++ b/src/widgets/dialogs/qmessagebox.cpp @@ -2719,6 +2719,7 @@ void QMessageBoxPrivate::helperPrepareShow(QPlatformDialogHelper *) options->setDetailedText(q->detailedText()); #endif options->setIcon(helperIcon(q->icon())); + options->setIconPixmap(q->iconPixmap()); options->setStandardButtons(helperStandardButtons(q)); }