小伙伴们会经常遇到一些托盘程序,有些程序关闭后,程序并没有退出,而是放入了托盘中,如下图:
那qt是如何实现这样的办法呢,其实就是用到了 QSystemTrayIcon类,通常有两种方法去写,第一种比较简单,直接利用
QSystemTrayIcon ,来达到一些基本的托盘程序,也是本文章要讲的。第二种是继承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"
#include
MainWindow::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;
}
}
程序就是使用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的同学可以私信我,希望点个赞吧。