其实qt的帮助文档里面有个例子,另外很多api在QSystemTrayIcon类里面。
首先建立Qt的gui工程,本文默认都带了ui文件,如果不带ui文件,需要在程序里手动代码写ui,所有代码都未修改main.cpp,就不贴了。
初级
mainwindow.h
#include <QMainWindow> #include <QPushButton> #include <QSystemTrayIcon> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QSystemTrayIcon *trayIcon; };
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //托盘信息相关 QIcon icon = QIcon("icon.png"); //png,ico,svg,bmp各种格式,尺寸无限制(推荐60x60),加载图标可以用相对、绝对、资源路径 trayIcon = new QSystemTrayIcon(this); trayIcon->setIcon(icon); trayIcon->setToolTip("a trayicon example"); //提示文字 QString title="tip title"; QString text="this is a tray tip"; trayIcon->show(); trayIcon->showMessage(title,text,QSystemTrayIcon::Information,5000); //最后一个参数为提示时长,默认10000,即10s } MainWindow::~MainWindow() { delete ui; }
这个最简单的例子可以实现托盘图标的显示、提示信息。
中级
需要用到信号槽
mainwindow.h
#include <QMainWindow> #include <QPushButton> #include <QSystemTrayIcon> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QSystemTrayIcon *trayIcon; void showMessage(char *msg); private slots: void iconActivated(QSystemTrayIcon::ActivationReason reason); };
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //托盘信息相关 QIcon icon = QIcon("icon.png"); trayIcon = new QSystemTrayIcon(this); trayIcon->setIcon(icon); trayIcon->setToolTip("a trayicon example"); trayIcon->show(); //必须调用,否则托盘图标不显示 connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this,SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); } void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: trayIcon->showMessage("title","你单击了"); //后面两个默认参数 break; case QSystemTrayIcon::DoubleClick: trayIcon->showMessage("title","你双击了"); break; case QSystemTrayIcon::MiddleClick: trayIcon->showMessage("title","你中键了"); break; default: break; } } MainWindow::~MainWindow() { delete ui; }
实现了托盘图标三种不同的鼠标响应
高级
综合实例,增加右键菜单管理窗口
mainwindow.h
#include <QMainWindow> #include <QPushButton> #include <QSystemTrayIcon> namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QSystemTrayIcon *trayIcon; QMenu *trayIconMenu; //窗口管理动作 QAction *minimizeAction; QAction *maximizeAction; QAction *restoreAction; QAction *quitAction; private slots: void iconActivated(QSystemTrayIcon::ActivationReason reason); };
mainwindow.cpp
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); //托盘初始化 QIcon icon = QIcon("icon.png"); trayIcon = new QSystemTrayIcon(this); trayIcon->setIcon(icon); trayIcon->setToolTip("a trayicon example"); trayIcon->show(); //必须调用,否则托盘图标不显示 //创建菜单项动作(以下动作只对windows有效) minimizeAction = new QAction("最小化~", this); connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide())); //绑定信号槽 maximizeAction = new QAction("最大化~", this); connect(maximizeAction, SIGNAL(triggered()), this, SLOT(showMaximized())); restoreAction = new QAction("还原~", this); connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal())); quitAction = new QAction("退出~", this); connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); //关闭应用,qApp对应的是程序全局唯一指针 //创建托盘菜单(必须先创建动作,后添加菜单项,还可以加入菜单项图标美化) trayIconMenu = new QMenu(this); trayIconMenu->addAction(minimizeAction); trayIconMenu->addAction(maximizeAction); trayIconMenu->addAction(restoreAction); trayIconMenu->addSeparator(); trayIconMenu->addAction(quitAction); trayIcon->setContextMenu(trayIconMenu); connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this,SLOT(iconActivated(QSystemTrayIcon::ActivationReason))); } void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason) { switch (reason) { case QSystemTrayIcon::Trigger: trayIcon->showMessage("title","你单击了"); //后面两个默认参数 break; case QSystemTrayIcon::DoubleClick: trayIcon->showMessage("title","你双击了"); break; case QSystemTrayIcon::MiddleClick: trayIcon->showMessage("title","你中键了"); break; default: break; } } MainWindow::~MainWindow() { delete ui; }
效果:
补充
点击关闭最小化到托盘,重写closeEvent事件,注意头文件
void MainWindow::closeEvent(QCloseEvent *event) { if(trayIcon->isVisible()) { hide(); //隐藏窗口 event->ignore(); //忽略事件 } }
同理,点击隐藏最小化到托盘重写hideEvent事件
void MainWindow::hideEvent(QHideEvent *event) { if(trayIcon->isVisible()) { hide(); //隐藏窗口 trayIcon->showMessage("title","隐藏到托盘图标了"); //提示用户隐藏到了托盘 event->ignore(); //忽略事件 } }
以上。