Qt中的系统托盘QSystemTrayIcon分析

本文介绍了如何在Qt应用中使用QSystemTrayIcon类实现系统托盘功能,包括设置图标、菜单、消息提示以及处理激活事件。重点讲解了如何避免应用程序因关闭消息而意外退出的问题,通过QApplication::setQuitOnLastWindowClosed(false)来解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

QSystemTrayIcon 类为系统托盘中的应用程序提供了一个图标。
现代操作系统通常在桌面上提供一个特殊区域,称为系统托盘或通知区域,长时间运行的应用程序可以在其中显示图标和短消息。

要检查用户桌面上是否存在系统托盘,请调用 QSystemTrayIcon::isSystemTrayAvailable() 静态函数。
要添加系统托盘条目,请创建一个 QSystemTrayIcon 对象,调用 setContextMenu() 为图标提供上下文菜单,并调用 show() 使其在系统托盘中可见。 可以使用 showMessage() 随时显示状态通知消息(“气球消息”)。

当用户激活图标时会发出 activate() 信号。

  • QSystemTrayIcon::ActivationReason
  1. 这个枚举描述了系统托盘被激活的原因。
QSystemTrayIcon::ActivationReason
Constant       Value

Description

QSystemTrayIcon::Unknown

0

Unknown reason

QSystemTrayIcon::Context

1

The context menu for the system tray entry was requested

QSystemTrayIcon::DoubleClick

2

The system tray entry was double clicked

QSystemTrayIcon::Trigger

3

The system tray entry was clicked

QSystemTrayIcon::MiddleClick

4

The system tray entry was clicked with the middle mouse button

  • QSystemTrayIcon::MessageIcon

        -此枚举描述了显示气球消息时显示的图标。

QSystemTrayIcon::MessageIcon
ConstantValue

Description

QSystemTrayIcon::NoIcon

0

No icon is shown.

QSystemTrayIcon::Information

1

An information icon is shown.

QSystemTrayIcon::Warning

2

A standard warning icon is shown.

QSystemTrayIcon::Critical

3

A critical warning icon is shown.

源码

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSystemTrayIcon>
#include <QString>
#include <QCloseEvent>
#include <QIcon>

class Widget : public QWidget
{
    Q_OBJECT
private:
    bool m_IsClose;
    QSystemTrayIcon m_tray;
    
    void initTray();
    
protected:
    void closeEvent(QCloseEvent *event);
    
private slots:
    void OnActivated(QSystemTrayIcon::ActivationReason reason);
    void OnTrayHomePage();
    void OnTrayAbout();
    void OnTrayExit();
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
};
#endif // WIDGET_H
#include "Widget.h"
#include <QMessageBox>
#include <QApplication>
#include <QDesktopServices>
#include <QUrl>
#include <QMenu>
#include <QAction>

Widget::Widget(QWidget *parent) : QWidget(parent), m_tray(parent)
{
    initTray();
    m_IsClose = false;
    //setWindowIcon(QIcon(":Res/Icon/Compass.ico"));
}

//系统托盘初始化 - 菜单
void Widget::initTray()
{
    m_tray.setIcon(QIcon(":Res/Icon/fire.ico"));
    
    QMenu* menu = new QMenu();
    menu->addAction(QIcon(":/Res/Icon/Home Page.ico"), QString::fromLocal8Bit("主页"), this, SLOT(OnTrayHomePage()));
    menu->addAction(QIcon(":/Res/Icon/About.ico"), QString::fromLocal8Bit("关于"), this, SLOT(OnTrayAbout()));
    menu->addAction(QIcon(":/Res/Icon/exit.png"), QString::fromLocal8Bit("退出"), this, SLOT(OnTrayExit()));
    
    m_tray.setContextMenu(menu);
    m_tray.setToolTip(QString::fromLocal8Bit("我是系统托盘"));
    m_tray.show();
    
    //显示系统托盘消息
    m_tray.showMessage(QString::fromLocal8Bit("提示"), QString::fromLocal8Bit("系统托盘测试"), QSystemTrayIcon::Information, 800);
    connect(&m_tray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(OnActivated(QSystemTrayIcon::ActivationReason)));
}

void Widget::closeEvent(QCloseEvent *event)
{
    if(m_IsClose)
    {
        event->accept();
    }
    else
    {
        hide();
        event->ignore();
    }
}

void Widget::OnActivated(QSystemTrayIcon::ActivationReason reason)
{
    switch (reason)
    {
    case QSystemTrayIcon::Trigger:
    case QSystemTrayIcon::DoubleClick:
        if(isHidden())
        {
            showNormal();
        }
        else
        {
            activateWindow();
        }
        break;
    default:
        break;
    }
}

void Widget::OnTrayExit()
{
    m_IsClose = true;
    QApplication::setQuitOnLastWindowClosed(true);
    close();
}

void Widget::OnTrayHomePage()
{
    QDesktopServices desktopServices;
    QUrl url(QString("www.baidu.com"));
    desktopServices.openUrl(url);
}

void Widget::OnTrayAbout()
{
    QMessageBox::information(NULL, QString::fromLocal8Bit("标题"), QString::fromLocal8Bit("内容"));
}

Widget::~Widget()
{
}

main函数:

#include "Widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    w.setWindowIcon(QIcon(":Res/Icon/Compass.ico"));
    a.setQuitOnLastWindowClosed(false);
    return a.exec();
}

运行参照:

问题

在系统托盘中调用QMessageBox之后关闭消息之后出现应用程序退出的问题解决办法如下:

调用这个函数 QApplication::setQuitOnLastWindowClosed(false);

项目链接:QSystemTrayIcon.rar-QT文档类资源-优快云下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值