带有自定义图标

时间:2015-06-25 08:45:43

标签: qt qt5 system-tray

QSystemTrayIcon有一个功能:

void showMessage(const QString &title, const QString &msg, MessageIcon icon = Information, int msecs = 10000);

有没有办法将其更改为自定义图标,例如像这样 -

void showIconMessage(const QString &title, const QString &msg, QIcon icon = QIcon(), int msecs = 10000);

,不修改Qt来源

我知道showMessage(d是QSystemTrayIconPrivate的实例,并使用Q_D(QSystemTrayIcon)宏调用)

void QSystemTrayIcon::showMessage(const QString& title, const QString& msg,
                            QSystemTrayIcon::MessageIcon icon, int msecs)
{
    Q_D(QSystemTrayIcon);
    if (d->visible)
        d->showMessage_sys(title, msg, icon, msecs);
}

showMessage_sys调用QSystemTrayIconPrivate,其中所有魔法图标都会发生:

void QSystemTrayIconPrivate::showMessage_sys(const QString &message,
                                             const QString &title,
                                             QSystemTrayIcon::MessageIcon icon,
                                             int msecs)
{
    if (!qpa_sys)
        return;

    QIcon notificationIcon;
    switch (icon) {
    case QSystemTrayIcon::Information:
        notificationIcon = QApplication::style()-   >standardIcon(QStyle::SP_MessageBoxInformation);
        break;
    case QSystemTrayIcon::Warning:
        notificationIcon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxWarning);
        break;
    case QSystemTrayIcon::Critical:
        notificationIcon = QApplication::style()->standardIcon(QStyle::SP_MessageBoxCritical);
        break;
    default:
        break;
    }
    qpa_sys->showMessage(message, title, notificationIcon,
                     static_cast<QPlatformSystemTrayIcon::MessageIcon>(icon), msecs);
}

现在看来,我需要在两个类中重新实现这两个函数,并且我已经准备好了,但是......似乎QSystemTrayIcon与QSystemTrayIconPrivate密切相关。 QSystemTrayIconPrivate的实例仅在QSystemTrayIcon构造函数中创建(如果我计划创建继承QSystemTrayIcon和QSystemTrayIconPrivate并重新实现showMessage函数的类,我实际上无法改变):

QSystemTrayIcon::QSystemTrayIcon(QObject *parent)
: QObject(*new QSystemTrayIconPrivate(), parent)
{
}

QSystemTrayIcon::QSystemTrayIcon(const QIcon &icon, QObject *parent)
: QObject(*new QSystemTrayIconPrivate(), parent)
{
    setIcon(icon);
}

那么我有什么遗漏的吗?或者是否有另一种方法可以简单地显示带有自定义图标的通知消息?

1 个答案:

答案 0 :(得分:2)

您可以尝试的内容(不确定它是否适用于系统托盘)与this回答中所述相同并覆盖SP_MessageBoxWarning / SP_MessageBoxCritical / {{1} }图标,但正如我所说,我不确定系统托盘是否只使用缩小版本的消息框图标或系统托盘图标是否分开。对于后者,我猜你必须修补QT源,可能会在SP_MessageBoxInformation添加一个新项目并修补开关以调用你提供的一些功能来返回所需的图标。类似的东西:

QSystemTrayIcon