QSystemTrayIcon ,来达到一些基本的托盘程序,也是本文章要讲的。第二种是继承QSystemTrayIcon类,这样子类设计可以使得托
盘程序更加功能强大,接下来给大家讲解简单的托盘:
托盘也出现了程序:
当我们关闭程序时候,
弹出了消息框,程序没有退出,在托盘依旧可以找到它,并且右击出现菜单:
点击恢复原来样子,或者双击托盘图标,可以恢复程序原来的位置;
下面我们来看代码部分:
对应的头文件:
1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QSystemTrayIcon> //托盘使用的头文件
6
7 namespace Ui {
8 class MainWindow;
9 }
10
11 class MainWindow : public QMainWindow
12 {
13 Q_OBJECT
14 private:
15 QSystemTrayIcon *SysIcon;
16 QAction *min; //最小化
17 QAction *max; //最大化
18 QAction *restor; //恢复
19 QAction *quit; //退出
20 QMenu *menu;
21 private:
22 void closeEvent(QCloseEvent * event);
23 public:
24 explicit MainWindow(QWidget *parent = nullptr);
25 ~MainWindow();
26
27
28
29 private slots:
30 void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
31 private:
32 Ui::MainWindow *ui;
33 };
34
35 #endif // MAINWINDOW_H
重写了closeEvent()函数,自定义了一个action函数:
对应的cpp文件:
1 #include "mainwindow.h"
2 #include "ui_mainwindow.h"
3 #include<QCloseEvent>
4
5 MainWindow::MainWindow(QWidget *parent) :
6 QMainWindow(parent),
7 ui(new Ui::MainWindow)
8 {
9 ui->setupUi(this);
10 menu = new QMenu(this);
11 QIcon icon(":/images/images/QtIcon.ico");
12 SysIcon = new QSystemTrayIcon(this);
13 SysIcon->setIcon(icon);
14 SysIcon->setToolTip("Qt托盘");
15 min = new QAction("窗口最小化",this);
16 connect(min,&QAction::triggered,this,&MainWindow::hide);
17 // connect(min,SIGNAL(trigger()),this,&MainWindow::hide);
18 max = new QAction("窗口最大化",this);
19 connect(max,&QAction::triggered,this,&MainWindow::showMaximized);
20 restor = new QAction("恢复原来的样子",this);
21 connect(restor,&QAction::triggered,this,&MainWindow::showNormal);
22 quit = new QAction("退出",this);
23 // connect(quit,&QAction::triggered,this,&MainWindow::close);
24 connect(quit,&QAction::triggered,qApp,&QApplication::quit);
25 connect(SysIcon,&QSystemTrayIcon::activated,this,&MainWindow::on_activatedSysTrayIcon);
26
27 menu->addAction(min);
28 menu->addAction(max);
29 menu->addAction(restor);
30 menu->addSeparator(); //分割
31 menu->addAction(quit);
32 SysIcon->setContextMenu(menu);
33 SysIcon->show();
34 close();
35 }
36
37 MainWindow::~MainWindow()
38 {
39 delete ui;
40 }
41
42 void MainWindow::closeEvent(QCloseEvent * event)
43 {
44 if(SysIcon->isVisible())
45 {
46 this->hide();
47 SysIcon->showMessage("Qt托盘","this is your first to get it");
48 event->ignore();
49 }
50 else {
51 event->accept();
52 }
53
54 }
55
56 void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
57 {
58 switch (reason) {
59
60 case QSystemTrayIcon::Trigger:
61 break;
62 case QSystemTrayIcon::DoubleClick:
63 this->show();
64 break;
65 default:
66 break;
67
68 }
69 }
程序就是使用QAction 的变量绑定了界面不同的功能,其中:
connect(quit,&QAction::triggered,qApp,&QApplication::quit);
托盘菜单的退出菜单才是真的关闭整个程序。
当我们点击关闭按钮时候执行了:
1 void MainWindow::closeEvent(QCloseEvent * event)
2 {
3 if(SysIcon->isVisible())
4 {
5 this->hide();
6 SysIcon->showMessage("Qt托盘","this is your first to get it");
7 event->ignore();
8 }
9 else {
10 event->accept();
11 }
12 }
当托盘还在的时候,界面影藏起来,消息使用ignore,这样窗口就不会关闭了,你学会了吗。
大家可以多想想,还有我们常见的东西,我们一起加油实现出来,让自己变得更加好。