Qt之程序最小化托盘显示及操作
展开
1.功能说明
对于GUI程序,如果想要实现当最小化时,程序从任务栏消失,在系统托盘显示一个图标,表示此程序,并能在托盘内通过双击或者菜单使程序界面恢复。
2.使用的类
主要使用的此类:QSystemTrayIcon。
其中QSystemTrayIcon是主要操作系统托盘的操作类,通过此类,可以在托盘显示指定程序的图标,响应用户鼠标的单击,双击,或wheel操作(好像只对X11系统有用),显示指定消息,显示菜单等。
此类中有两个枚举类型,分别如下:
enum QSystemTrayIcon::ActivationReason 表述托盘上图标的触发缘由
主要使用的此类:QSystemTrayIcon。
其中QSystemTrayIcon是主要操作系统托盘的操作类,通过此类,可以在托盘显示指定程序的图标,响应用户鼠标的单击,双击,或wheel操作(好像只对X11系统有用),显示指定消息,显示菜单等。
此类中有两个枚举类型,分别如下:
enum QSystemTrayIcon::ActivationReason 表述托盘上图标的触发缘由
常量 值 描述
QSystemTrayIcon::Unknown 0 未知原因
QSystemTrayIcon::Context 1 请求系统托盘的上下文菜单
QSystemTrayIcon::DoubleClick 2 鼠标双击
QSystemTrayIcon::Trigger 3 鼠标单击
QSystemTrayIcon::MiddleClick 4 鼠标中间按键
enum QSystemTrayIcon::MessageIcon 当显示气球消息时显示的图片
QSystemTrayIcon::Unknown 0 未知原因
QSystemTrayIcon::Context 1 请求系统托盘的上下文菜单
QSystemTrayIcon::DoubleClick 2 鼠标双击
QSystemTrayIcon::Trigger 3 鼠标单击
QSystemTrayIcon::MiddleClick 4 鼠标中间按键
enum QSystemTrayIcon::MessageIcon 当显示气球消息时显示的图片
常量 值 描述
QSystemTrayIcon::NoIcon 0 不显示图标
QSystemTrayIcon::Information 1 显示信息图标
QSystemTrayIcon::Warning 2 显示告警图标
QSystemTrayIcon::Critical 3 显示致命图标
3.QSystemTrayIcon常用函数
void setIcon(const QIcon& icon)
设置系统托盘的图标
void setToolTip(const QString &tip)
设置鼠标放到图标上的提示文字
void setContextMenu(QMenu* menu);
设置当点击图标弹出的菜单
void show()
显示系统托盘图标
QSystemTrayIcon::NoIcon 0 不显示图标
QSystemTrayIcon::Information 1 显示信息图标
QSystemTrayIcon::Warning 2 显示告警图标
QSystemTrayIcon::Critical 3 显示致命图标
3.QSystemTrayIcon常用函数
void setIcon(const QIcon& icon)
设置系统托盘的图标
void setToolTip(const QString &tip)
设置鼠标放到图标上的提示文字
void setContextMenu(QMenu* menu);
设置当点击图标弹出的菜单
void show()
显示系统托盘图标
4.代码
1.实现程序托盘显示
a)新建一个QWidget程序,在界面上放入一个QPushButton,text改为“最小化”,如下图:
1.实现程序托盘显示
a)新建一个QWidget程序,在界面上放入一个QPushButton,text改为“最小化”,如下图:
b)给工程加入Qt Resource资源文件,添加一个在托盘显示的icon图片,如图:
c)给a中的QPushButton,建立槽函数,在槽函数内实现程序最小化托盘显示
void MainWindow::on_pushButton_clicked()
{
//隐藏程序主窗口
this->hide();
{
//隐藏程序主窗口
this->hide();
//新建QSystemTrayIcon对象
mSysTrayIcon = new QSystemTrayIcon(this);
//新建托盘要显示的icon
QIcon icon = QIcon("../IMClient/Resources/GG64.png");
//将icon设到QSystemTrayIcon对象中
mSysTrayIcon->setIcon(icon);
//当鼠标移动到托盘上的图标时,会显示此处设置的内容
mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标"));
//在系统托盘显示此对象
mSysTrayIcon->show();
}
运行程序,点击按钮最小化,可以在系统托盘看到此图标,鼠标移到上面,可以见看见代码中所设的”测试系统托盘图标”文本,如图:
mSysTrayIcon = new QSystemTrayIcon(this);
//新建托盘要显示的icon
QIcon icon = QIcon("../IMClient/Resources/GG64.png");
//将icon设到QSystemTrayIcon对象中
mSysTrayIcon->setIcon(icon);
//当鼠标移动到托盘上的图标时,会显示此处设置的内容
mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标"));
//在系统托盘显示此对象
mSysTrayIcon->show();
}
运行程序,点击按钮最小化,可以在系统托盘看到此图标,鼠标移到上面,可以见看见代码中所设的”测试系统托盘图标”文本,如图:
2.实现托盘图标操作
最小化后显示在系统托盘内,此时除了在任务管理器中结束此程序,无法再做其他操作,而我们还想实现双击图标显示主界面,单击图标弹出菜单等实现其他操作,此时,就需要使用QSystemTrayIcon::ActivationReason属性了。
a)给QSystemTrayIcon对象添加信号为activated(QSystemTrayIcon::ActivationReason)的槽函数
b)在槽函数内,对双击事件,显示主窗口界面
代码如下:
void MainWindow::on_pushButton_clicked()
{
//隐藏主窗口
this->hide();
{
//隐藏主窗口
this->hide();
......
//当鼠标移动到托盘上的图标时,会显示此处设置的内容
mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标"));
//给QSystemTrayIcon添加槽函数
connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
//在系统托盘显示此对象
mSysTrayIcon->show();
}
void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
switch(reason){
case QSystemTrayIcon::Trigger:
//单击托盘图标
break;
case QSystemTrayIcon::DoubleClick:
//双击托盘图标
//双击后显示主程序窗口
this->show();
break;
default:
break;
}
}
程序最小化后,双击托盘图标,程序的主界面可以显示了。
//当鼠标移动到托盘上的图标时,会显示此处设置的内容
mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标"));
//给QSystemTrayIcon添加槽函数
connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
//在系统托盘显示此对象
mSysTrayIcon->show();
}
void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
switch(reason){
case QSystemTrayIcon::Trigger:
//单击托盘图标
break;
case QSystemTrayIcon::DoubleClick:
//双击托盘图标
//双击后显示主程序窗口
this->show();
break;
default:
break;
}
}
程序最小化后,双击托盘图标,程序的主界面可以显示了。
最后再来考虑在单击系统托盘图标时,显示菜单功能。根据上面描述,思路很明确了,如下:
a)新建一个QMenu menu
b)将menu通过QSystemTrayIcon的setContextMenu函数设置到QSystemTrayIcon对象中
再来看代码实现:
在头文件中新增:
a)新建一个QMenu menu
b)将menu通过QSystemTrayIcon的setContextMenu函数设置到QSystemTrayIcon对象中
再来看代码实现:
在头文件中新增:
QMenu *mMenu;
QAction *mShowMainAction;
QAction *mExitAppAction;
...
public:
void createActions();
void createMenu();
...
private slots:
...
void on_showMainAction();
void on_exitAppAction();
在cpp中实现:
QAction *mShowMainAction;
QAction *mExitAppAction;
...
public:
void createActions();
void createMenu();
...
private slots:
...
void on_showMainAction();
void on_exitAppAction();
在cpp中实现:
void MainWindow::createActions()
{
mShowMainAction = new QAction(QObject::trUtf8("显示主界面"),this);
connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));
{
mShowMainAction = new QAction(QObject::trUtf8("显示主界面"),this);
connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));
mExitAppAction = new QAction(QObject::trUtf8("退出"),this);
connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));
connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));
}
void MainWindow::createMenu()
{
mMenu = new QMenu(this);
//新增菜单项---显示主界面
mMenu->addAction(mShowMainAction);
//增加分隔符
mMenu->addSeparator();
//新增菜单项---退出程序
mMenu->addAction(mExitAppAction);
//把QMenu赋给QSystemTrayIcon对象
mSysTrayIcon->setContextMenu(mMenu);
}
/*
* 当在系统托盘点击菜单内的显示主界面操作
*/
void MainWindow::on_showMainAction()
{
this->show();
}
{
mMenu = new QMenu(this);
//新增菜单项---显示主界面
mMenu->addAction(mShowMainAction);
//增加分隔符
mMenu->addSeparator();
//新增菜单项---退出程序
mMenu->addAction(mExitAppAction);
//把QMenu赋给QSystemTrayIcon对象
mSysTrayIcon->setContextMenu(mMenu);
}
/*
* 当在系统托盘点击菜单内的显示主界面操作
*/
void MainWindow::on_showMainAction()
{
this->show();
}
/*
* 当在系统托盘点击菜单内的退出程序操作
*/
void MainWindow::on_exitAppAction()
{
exit(0);
}
然后
* 当在系统托盘点击菜单内的退出程序操作
*/
void MainWindow::on_exitAppAction()
{
exit(0);
}
然后
void MainWindow::on_pushButton_clicked()
{
......
//给QSystemTrayIcon添加槽函数
connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
{
......
//给QSystemTrayIcon添加槽函数
connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
//建立托盘操作的菜单
createActions();
createMenu();
//在系统托盘显示此对象
mSysTrayIcon->show();
}
最后再看看消息球的使用
createActions();
createMenu();
//在系统托盘显示此对象
mSysTrayIcon->show();
}
最后再看看消息球的使用
void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
switch(reason){
case QSystemTrayIcon::Trigger:
//显示消息球,1s后自动消失
//第一个参数是标题
//第二个参数是消息内容
//第三个参数图标
//第四个参数是超时毫秒数
mSysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
QObject::trUtf8("欢迎使用此程序"),
QSystemTrayIcon::Information,
1000);
break;
case QSystemTrayIcon::DoubleClick:
this->show();
break;
default:
break;
}
}
关于系统托盘操作的笔记就记录到此了,最后是完整代码的实现。
{
switch(reason){
case QSystemTrayIcon::Trigger:
//显示消息球,1s后自动消失
//第一个参数是标题
//第二个参数是消息内容
//第三个参数图标
//第四个参数是超时毫秒数
mSysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
QObject::trUtf8("欢迎使用此程序"),
QSystemTrayIcon::Information,
1000);
break;
case QSystemTrayIcon::DoubleClick:
this->show();
break;
default:
break;
}
}
关于系统托盘操作的笔记就记录到此了,最后是完整代码的实现。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
namespace Ui {
class MainWindow;
}
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
public:
QSystemTrayIcon *mSysTrayIcon;
QMenu *mMenu;
QAction *mShowMainAction;
QAction *mExitAppAction;
QSystemTrayIcon *mSysTrayIcon;
QMenu *mMenu;
QAction *mShowMainAction;
QAction *mExitAppAction;
public:
void createActions();
void createMenu();
void createActions();
void createMenu();
private slots:
void on_pushButton_clicked();
void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
void on_showMainAction();
void on_exitAppAction();
void on_pushButton_clicked();
void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);
void on_showMainAction();
void on_exitAppAction();
private:
Ui::MainWindow *ui;
};
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QIcon>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
//隐藏主窗口
this->hide();
{
//隐藏主窗口
this->hide();
//新建QSystemTrayIcon对象
mSysTrayIcon = new QSystemTrayIcon(this);
//新建托盘要显示的icon
QIcon icon = QIcon("../IMClient/Resources/GG64.png");
//将icon设到QSystemTrayIcon对象中
mSysTrayIcon->setIcon(icon);
//当鼠标移动到托盘上的图标时,会显示此处设置的内容
mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标"));
//给QSystemTrayIcon添加槽函数
connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
mSysTrayIcon = new QSystemTrayIcon(this);
//新建托盘要显示的icon
QIcon icon = QIcon("../IMClient/Resources/GG64.png");
//将icon设到QSystemTrayIcon对象中
mSysTrayIcon->setIcon(icon);
//当鼠标移动到托盘上的图标时,会显示此处设置的内容
mSysTrayIcon->setToolTip(QObject::trUtf8("测试系统托盘图标"));
//给QSystemTrayIcon添加槽函数
connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason)));
//建立托盘操作的菜单
createActions();
createMenu();
//在系统托盘显示此对象
mSysTrayIcon->show();
}
createActions();
createMenu();
//在系统托盘显示此对象
mSysTrayIcon->show();
}
void MainWindow::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason)
{
switch(reason){
case QSystemTrayIcon::Trigger:
mSysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
QObject::trUtf8("欢迎使用此程序"),
QSystemTrayIcon::Information,
1000);
break;
case QSystemTrayIcon::DoubleClick:
this->show();
break;
default:
break;
}
}
{
switch(reason){
case QSystemTrayIcon::Trigger:
mSysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
QObject::trUtf8("欢迎使用此程序"),
QSystemTrayIcon::Information,
1000);
break;
case QSystemTrayIcon::DoubleClick:
this->show();
break;
default:
break;
}
}
void MainWindow::createActions()
{
mShowMainAction = new QAction(QObject::trUtf8("显示主界面"),this);
connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));
{
mShowMainAction = new QAction(QObject::trUtf8("显示主界面"),this);
connect(mShowMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));
mExitAppAction = new QAction(QObject::trUtf8("退出"),this);
connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));
connect(mExitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));
}
void MainWindow::createMenu()
{
mMenu = new QMenu(this);
mMenu->addAction(mShowMainAction);
{
mMenu = new QMenu(this);
mMenu->addAction(mShowMainAction);
mMenu->addSeparator();
mMenu->addAction(mExitAppAction);
mSysTrayIcon->setContextMenu(mMenu);
}
}
void MainWindow::on_showMainAction()
{
this->show();
}
{
this->show();
}
void MainWindow::on_exitAppAction()
{
exit(0);
}
————————————————
版权声明:本文为CSDN博主「祝云飞」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhuyunfei/article/details/51433822
{
exit(0);
}
————————————————
版权声明:本文为CSDN博主「祝云飞」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhuyunfei/article/details/51433822