QT中自定义系统托盘的实现—c++语言为例
将要介绍的是:QT中自定义系统托盘(systemtray)的一个Demo,希望能帮需要的读者快速上手。
前提假设是诸位已经知道QT中的signals 、slot以及资源文件,所以关于这些不会再累述。
我的QT版本如下:
整体的工程目录如下所示:
创建过程如下:
首先新建一个MainWindow工程,工程名为systemTray,会包含5个文件systemTray.pro、main.cpp、mainwindow.h、mainwindow.cpp和aminwindow.ui
这时运行程序会生成一个空白窗口如下:
然后添加资源文件,用于设为系统托盘图标,这里我上穿的是main.ico,也可以上传png图片等,具体请学习如何添加资源文件。
然后新建一个C++类systemTray,继承QSystemTrayIcon,产生两个文件systemTray.h和systemTray.cpp
自定义的系统托盘的实现就在上面这两个文件里。
systemTray.h如下:
#ifndef SYSTEMTRAY_H #define SYSTEMTRAY_H #include <QSystemTrayIcon> #include <QAction> #include <QApplication> #include <QMenu> class SystemTray : public QSystemTrayIcon { Q_OBJECT public: explicit SystemTray(QWidget *parent = 0); ~SystemTray(); void addAction(); void createAction(); private: QMenu *myMenu;//托盘菜单 QAction *restoreWinAction;//还原 QAction *quitAction;//退出 QAction *aboutUsAction;//关于我们 QAction *updateAction;//更新 private slots: signals: void showWidget(); private slots: void showAboutUs(); }; #endif // SYSTEMTRAY_H
系统托盘菜单有四个选项:还原、退出、关于我们和更新。上面的signals:showwidget() 是点击还原时发送的信号,信号交给mainwindow处理。showAboutUs是点击关于时触发的事件。
systemTray.cpp如下:
#include "systemtray.h" SystemTray::SystemTray(QWidget *parent) : QSystemTrayIcon(parent) { createAction(); addAction(); } SystemTray::~SystemTray() { } void SystemTray::createAction() { restoreWinAction = new QAction("还原",this); aboutUsAction = new QAction("关于",this); updateAction = new QAction("更新",this); quitAction = new QAction("退出",this); myMenu = new QMenu(); this->setIcon(QIcon(":/Icon/systemIcon/main.ico")); this->setToolTip("系统托盘演示程序"); connect(restoreWinAction, SIGNAL(triggered()), this, SIGNAL(showWidget())); connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit())); connect(aboutUsAction,SIGNAL(triggered()),this,SLOT(showAboutUs())); this->setContextMenu(myMenu); //设置托盘上下文菜单 this->show(); } void SystemTray::addAction(){ myMenu->addAction(restoreWinAction); myMenu->addAction(aboutUsAction); myMenu->addAction(updateAction); myMenu->addAction(quitAction); } void SystemTray::showAboutUs(){ //显示关于我们的窗口,没有具体实现 //当然也可以不用SOLT函数,而是像“还原“操作一样,发送信号出去,留给主窗口来处理 }
mainwindow.h如下:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> #include "systemtray.h" #include "QSystemTrayIcon" namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; SystemTray * myTray; //自定义系统托盘 private slots: void ShowWindow(); //处理还原操作 void SystemTrayActivated(QSystemTrayIcon::ActivationReason reason);//处理点击托盘操作 }; #endif // MAINWINDOW_H
mainwindow.cpp如下:
#include "mainwindow.h" #include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); myTray = new SystemTray(this); connect(myTray,SIGNAL(showWidget()),this,SLOT(ShowWindow()));//关联信号和槽函数 connect(myTray, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(SystemTrayActivated(QSystemTrayIcon::ActivationReason))); } MainWindow::~MainWindow() { delete ui; } void MainWindow::ShowWindow(){ this->showNormal(); this->raise(); this->activateWindow(); } void MainWindow::SystemTrayActivated(QSystemTrayIcon::ActivationReason reason) { switch(reason) { case QSystemTrayIcon::Trigger: { ShowWindow(); break; } case QSystemTrayIcon::DoubleClick: { ShowWindow(); break; } default: break; } }