qt|qt 之 QSystemTrayIcon(托盘程序整个例子)

小伙伴们会经常遇到一些托盘程序,有些程序关闭后,程序并没有退出,而是放入了托盘中,如下图:
qt|qt 之 QSystemTrayIcon(托盘程序整个例子)
文章图片

那qt是如何实现这样的办法呢,其实就是用到了 QSystemTrayIcon类,通常有两种方法去写,第一种比较简单,直接利用
QSystemTrayIcon ,来达到一些基本的托盘程序,也是本文章要讲的。第二种是继承QSystemTrayIcon类,这样子类设计可以使得托
盘程序更加功能强大,接下来给大家讲解简单的托盘:

qt|qt 之 QSystemTrayIcon(托盘程序整个例子)
文章图片


托盘也出现了程序:
qt|qt 之 QSystemTrayIcon(托盘程序整个例子)
文章图片

【qt|qt 之 QSystemTrayIcon(托盘程序整个例子)】
当我们关闭程序时候,
qt|qt 之 QSystemTrayIcon(托盘程序整个例子)
文章图片

弹出了消息框,程序没有退出,在托盘依旧可以找到它,并且右击出现菜单:
qt|qt 之 QSystemTrayIcon(托盘程序整个例子)
文章图片

点击恢复原来样子,或者双击托盘图标,可以恢复程序原来的位置;
下面我们来看代码部分:
对应的头文件:

#ifndef MAINWINDOW_H #define MAINWINDOW_H#include #include //托盘使用的头文件namespace Ui { class MainWindow; }class MainWindow : public QMainWindow { Q_OBJECT private: QSystemTrayIcon *SysIcon; QAction *min; //最小化 QAction *max; //最大化 QAction *restor; //恢复 QAction *quit; //退出 QMenu *menu; private: void closeEvent(QCloseEvent * event); public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H


重写了closeEvent()函数,自定义了一个action函数:
对应的cpp文件:
#include "mainwindow.h" #include "ui_mainwindow.h" #includeMainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); menu = new QMenu(this); QIcon icon(":/images/images/QtIcon.ico"); SysIcon = new QSystemTrayIcon(this); SysIcon->setIcon(icon); SysIcon->setToolTip("Qt托盘"); min = new QAction("窗口最小化",this); connect(min,&QAction::triggered,this,&MainWindow::hide); //connect(min,SIGNAL(trigger()),this,&MainWindow::hide); max = new QAction("窗口最大化",this); connect(max,&QAction::triggered,this,&MainWindow::showMaximized); restor = new QAction("恢复原来的样子",this); connect(restor,&QAction::triggered,this,&MainWindow::showNormal); quit = new QAction("退出",this); //connect(quit,&QAction::triggered,this,&MainWindow::close); connect(quit,&QAction::triggered,qApp,&QApplication::quit); connect(SysIcon,&QSystemTrayIcon::activated,this,&MainWindow::on_activatedSysTrayIcon); menu->addAction(min); menu->addAction(max); menu->addAction(restor); menu->addSeparator(); //分割 menu->addAction(quit); SysIcon->setContextMenu(menu); SysIcon->show(); close(); }MainWindow::~MainWindow() { delete ui; }void MainWindow::closeEvent(QCloseEvent * event) { if(SysIcon->isVisible()) { this->hide(); SysIcon->showMessage("Qt托盘","this is your first to get it"); event->ignore(); } else { event->accept(); }}void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason) { switch (reason) {case QSystemTrayIcon::Trigger: break; case QSystemTrayIcon::DoubleClick: this->show(); break; default: break; } }

qt|qt 之 QSystemTrayIcon(托盘程序整个例子)
文章图片

程序就是使用QAction 的变量绑定了界面不同的功能,其中:
connect(quit,&QAction::triggered,qApp,&QApplication::quit);

托盘菜单的退出菜单才是真的关闭整个程序。
当我们点击关闭按钮时候执行了:
void MainWindow::closeEvent(QCloseEvent * event) { if(SysIcon->isVisible()) { this->hide(); SysIcon->showMessage("Qt托盘","this is your first to get it"); event->ignore(); } else { event->accept(); }}

当托盘还在的时候,界面影藏起来,消息使用ignore,这样窗口就不会关闭了,你学会了吗。
大家可以多想想,还有我们常见的东西,我们一起加油实现出来,让自己变得更加好。
我是比卡丘不皮,喜欢的朋友可以关注我的博客,一起学习,需要demo的同学可以私信我,希望点个赞吧。

    推荐阅读