Qt系统托盘程序的创建
一般来说,我们的应用程序都是控制台程序,或者窗口程序,点击应用程序右上角的关闭按钮,就会将程序关闭。但是有些应用,例如微信、或者杀毒软件等等,点击关闭按钮后,只是将程序最小化到右下角的菜单栏而已,并没有关闭程序。而要彻底关闭程序,需要点击右下角对应程序的右键菜单,进行退出。
那么,这种托盘程序,在QT是怎么实现的呢?
Qt中,通过类QSystemTrayIcon,实现系统托盘,右键菜单的实现,通过QMenu和QAction实现。
直接上代码
sysTrayIconWidget.h
#ifndef SYSTRAYICONWIDGET_H
#define SYSTRAYICONWIDGET_H
#include <QWidget>
#include <QSystemTrayIcon>
#include <QMenu>
#include <QAction>
#include <QCloseEvent>
QT_BEGIN_NAMESPACE
namespace Ui { class SysTrayIconWidget; }
QT_END_NAMESPACE
class SysTrayIconWidget : public QWidget
{
Q_OBJECT
public:
SysTrayIconWidget(QWidget *parent = nullptr);
~SysTrayIconWidget() override;
private:
Ui::SysTrayIconWidget *ui;
QSystemTrayIcon *m_sysTrayIcon; //系统托盘
void initSysTrayIcon();
QMenu *m_menu; //菜单
QAction *m_showMainAction; //动作
QAction *m_exitAppAction; //动作
void createActions();
void createMenu();
private slots:
void on_showMainAction();
void on_exitAppAction();
protected:
void closeEvent (QCloseEvent *event) override;
};
#endif // SYSTRAYICONWIDGET_H
sysTrayIconWidget.cpp
#include "sysTrayIconWidget.h"
#include "ui_sysTrayIconWidget.h"
#include <QMessageBox>
SysTrayIconWidget::SysTrayIconWidget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::SysTrayIconWidget)
{
ui->setupUi(this);
initSysTrayIcon();
}
SysTrayIconWidget::~SysTrayIconWidget()
{
delete ui;
}
//创建系统托盘
void SysTrayIconWidget::initSysTrayIcon()
{
//隐藏程序主窗口
this->hide();
//新建QSystemTrayIcon对象
m_sysTrayIcon = new QSystemTrayIcon(this);
//设置托盘图标
QIcon icon = QIcon(":/images/testIcon.png"); //资源文件添加的图标
m_sysTrayIcon->setIcon(icon);
//当鼠标移动到托盘上的图标时,会显示此处设置的内容
m_sysTrayIcon->setToolTip("托盘提示信息");
//给QSystemTrayIcon添加槽函数
connect(m_sysTrayIcon, &QSystemTrayIcon::activated,
[=](QSystemTrayIcon::ActivationReason reason)
{
switch(reason)
{
case QSystemTrayIcon::Trigger:
//单击托盘图标
m_sysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
QObject::trUtf8("欢迎使用此程序"),
QSystemTrayIcon::Information,
1000);
break;
case QSystemTrayIcon::DoubleClick:
//双击托盘图标
//双击后显示主程序窗口
this->show();
break;
default:
break;
}
});
//建立托盘操作的菜单
createActions();
createMenu();
//在系统托盘显示此对象
m_sysTrayIcon->show();
}
//创建动作
void SysTrayIconWidget::createActions()
{
m_showMainAction = new QAction("关于系统", this);
connect(m_showMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));
m_exitAppAction = new QAction("退出", this);
connect(m_exitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));
}
//创建托盘菜单
void SysTrayIconWidget::createMenu()
{
m_menu = new QMenu(this);
//新增菜单项---显示主界面
m_menu->addAction(m_showMainAction);
//增加分隔符
m_menu->addSeparator();
//新增菜单项---退出程序
m_menu->addAction(m_exitAppAction);
//把QMenu赋给QSystemTrayIcon对象
m_sysTrayIcon->setContextMenu(m_menu);
}
//当在系统托盘点击菜单内的显示主界面操作
void SysTrayIconWidget::on_showMainAction()
{
QApplication::setQuitOnLastWindowClosed( false );
QMessageBox::information(nullptr, "xxxx", "xxxx有限公司copyright©2022");
}
//当在系统托盘点击菜单内的退出程序操作
void SysTrayIconWidget::on_exitAppAction()
{
qApp->exit();
}
//关闭事件
void SysTrayIconWidget::closeEvent(QCloseEvent *event)
{
//忽略窗口关闭事件
QApplication::setQuitOnLastWindowClosed( true );
this->hide();
event->ignore();
}
需要注意的是:一定要在closeEvent()中忽略关闭窗口关闭事件,否则,点击右上角的关闭按钮后,还是会退出程序。
文章来源:https://www.toymoban.com/news/detail-400478.html
文章来源地址https://www.toymoban.com/news/detail-400478.html
到了这里,关于Qt系统托盘程序的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!