QSystemTrayIcon 类为系统托盘中的应用程序提供了一个图标。
现代操作系统通常在桌面上提供一个特殊区域,称为系统托盘或通知区域,长时间运行的应用程序可以在其中显示图标和短消息。
要检查用户桌面上是否存在系统托盘,请调用 QSystemTrayIcon::isSystemTrayAvailable() 静态函数。
要添加系统托盘条目,请创建一个 QSystemTrayIcon 对象,调用 setContextMenu() 为图标提供上下文菜单,并调用 show() 使其在系统托盘中可见。 可以使用 showMessage() 随时显示状态通知消息(“气球消息”)。
当用户激活图标时会发出 activate() 信号。
- 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
-此枚举描述了显示气球消息时显示的图标。
Constant | Value | 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);