QT最小化程序到托盘运行
MinTray
说明
- 实现程序关闭时最小化托盘的功能
- 托盘实现显示主页面和退出的功能
- 支持扩展,直接引用TrayIcon类即可,对外暴露接口
- 单例实现,可复用
警告
- 注:博主所有资源永久免费,若有帮助,请点赞转发是对我莫大的帮助
- 注:博主本人学习过程的分享,引用他人的文章皆会标注原作者
- 注:本人文章非盈利性质,若有侵权请联系我删除
- 注:获取资源或者咨询问题请联系Q:2950319782
- 注:博主本人很菜,文章基本是二次创作,大佬请忽略我的随笔
- 注:我会一步步分享实现的细节,若仍有问题联系我
GitHub
开发环境
- win10系统
- qtcreator4.11.1
- QT版本:5.14.2
问题解决
需求
- 程序在关闭的时候需要供用户选择是直接关闭程序还是最小化在托盘运行
- 在托盘运行,程序主界面要隐藏
- 托盘要提供最基本的显示回主界面和退出程序的功能
结构
思路
- 这里主要为了实现关闭程序的时候实现程序托盘运行的demo,随便创建一个widget程序Tray即可,重写窗口的CloseEvent事件,处理关闭程序和最小化到托盘运行的功能
- 使用QT自带的QSystemTrayIcon来实现托盘的功能,单独创建一个TrayIcon类来封装,继承自Object即可,不需要ui文件,
- 由于托盘这个类功能比较单一,而且是需要的 时候才创建,而且不能跟随调用者的生存周期,这里使用懒汉单例实现最好,最好使用智能指针,省的发生内存泄漏,在Tray窗口需要的时候才创建
- 下面先来实现TrayIcon的单例,这里使用返回static TrayIcon* 的Instance函数加独占智能指针实现
- 这里我是选择在CloseEvent事件中创建TrayIcon实例
- 在TrayIcon类中,首先需要维持所属的主窗体mainWidget和托盘对象trayIcon,同时定义public的设置主窗体函数setMainWidget来设置调用的主窗体
- 在TrayIcon的构造函数中实例化托盘对象trayIcon,设置图标,完成初始配置
- 到这里只要设置托盘为可见,托盘就已经可以显示出来了,但是没法关闭程序和显示主页面了,下面来实现这两个功能
- 首先创建菜单QMenu,因为这个菜单功能主要是跟主窗口的交互,那么在传入主窗口的setMainWidget函数中设置菜单为好
- 先加上回显主窗体的功能,定义回显函数showMainWidget
- 下面处理关闭程序的功能,这里最好是设置一个是关闭托盘还是关闭程序的标志位,判断一下最好
- 菜单功能处理后,是需要将菜单和鼠标右键绑定,否则不能处理相关操作
- 最后处理一下托盘激活程序,为了简单,这里双击和单击都回显主窗体
关键代码
重写CloseEvent事件
void Tray::closeEvent(QCloseEvent *event)
{
//弹出一个选择按钮,是否最小化程序到托盘运行
QMessageBox::StandardButton button = QMessageBox::question(this,"提示","是否最小化到系统托盘", QMessageBox::Yes|QMessageBox::No,
QMessageBox::Yes);
//不关闭程序,最小化程序到托盘运行
if(button == QMessageBox::Yes)
{
//设置托盘所属的主窗体
TrayIcon::Instance()->setMainWidget(this);
//忽略关闭事件
event->ignore();
//隐藏主窗口
this->hide();
//设置托盘可见
TrayIcon::Instance()->setVisible(true);
//设置提示消息,看不见消息的是电脑开启了勿扰模式
TrayIcon::Instance()->showMessage("自定义最小化托盘",
"已最小化");
}
//关闭程序
else
{
event->accept();
}
}实现懒汉单例
//定义懒汉单例
TrayIcon* TrayIcon::Instance()
{
if(self.isNull())
{
static QMutex mutex;
QMutexLocker locker(&mutex);
if(self.isNull())
{
self.reset(new TrayIcon);
}
}
return self.data();
}
回显主窗体函数
//定义显示主界面的槽函数
void TrayIcon::showMainWidget()
{
//有主窗体
if(mainWidget)
{
//显示出来主窗体
mainWidget->showNormal();
//重新聚焦主窗体
mainWidget->activateWindow();
}
}
关闭程序函数
//定义关闭的槽函数
void TrayIcon::closeAll()
{
//隐藏,并删掉,退出程序
trayIcon->hide();
trayIcon->deleteLater();
qApp->exit();
}
设置调用的主窗体,并绑定相关的功能
//定义设置所属的主窗体
void TrayIcon::setMainWidget(QWidget *mainWidget)
{
this->mainWidget = mainWidget;
//给托盘加上菜单功能
menu->addAction("主界面",this,SLOT(showMainWidget()));
//直接退出
if(exitDirect)
{
menu->addAction("退出",this,SLOT(closeAll()));
}
else
{
menu->addAction("退出",this,SIGNAL(trayIconExit()));
}
//菜单绑定到右键
trayIcon->setContextMenu(menu); }
QT最小化程序到托盘运行的更多相关文章
- WPF应用最小化至系统托盘运行
原文:WPF应用最小化至系统托盘运行 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/lordwish/article/details/5178889 ...
- 将 VMware 最小化到系统托盘
1, 下载 Trayconizer官网地址: http://www.whitsoftdev.com/trayconizer/下载地址: http://www.whitsoftdev.com/files ...
- Delphi 7下最小化到系统托盘
在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789 _NOTIFY ...
- Delphi 7下最小化到系统托盘(主要是WM_TRAYMSG和WM_SYSCOMMAND消息)
在Delphi 7下要制作系统托盘,只能制作一个比较简单的系统托盘,因为ShellAPI文件定义的TNotifyIconData结构体是比较早的版本.定义如下: 123456789 _NOTIFY ...
- C# WinForm窗口最小化到系统托盘
* C# WinForm窗口最小化到系统托盘http://hi.baidu.com/kfxtgtqyapouyze/item/8ccfdcd5a174a7312a35c7c3 主要功能:(1).程序启 ...
- 大神为你分析 Go、Java、C 等主流编程语言(Go可以替代Java,而且最小化程序员的工作量,学习比较容易)
本文主要分析 C.C++98.C++11.Java 与 Go,主要论述语言的关键能力.在论述的过程中会结合华为各语言编程专家和华为电信软件内部的骨干开发人员的交流,摒弃语言偏好或者语言教派之争,尽量以 ...
- 将Mozilla ThunderBird最小化到系统托盘(转载)
转自:http://be-evil.org/mozilla-thunderbird-minize-to-tray.html Mozilla ThunderBird是一款非常不错的邮件客户端,但是其在默 ...
- electron监听系统托盘,electron是否最小化到系统托盘
在项目中需要判断窗口是否最小化在系统托盘上,任务栏那已经关闭,查了一晚上的api,始终找不到可以调用的方法,最后绞尽脑汁想到了一个办法,那就是在点右上角的关闭按钮时,加个全局变量,用来标识已经最小到系 ...
- MFC程序最小化到系统托盘及其响应函数
预备知识: Windows API函数: WINSHELLAPI BOOL WINAPI Shell_NotifyIcon( DWORD dwMessage, PNOTIFYICONDATA pnid ...
- Delphi 最小化程序到任务栏托盘 增加右键PopMenu
在做中间层时,中间层往往不需要点击关闭时立刻关闭,而是最小化到托盘.故而特意隐藏关闭按钮功能. 1)隐藏退出功能 用PopMenu退出菜单代替 1.增加popMenu退出菜单,绑定到窗体 2.增加变量 ...
随机推荐
- Programming abstractions in C阅读笔记:p91-p106
<Programming Abstractions In C>学习第45天,p91-p102,完成第二章内容学习.总结如下: 一.技术总结 1.垃圾回收 p91,"Some la ...
- LDAP:如何在windows系统下安装LDAP及连接测试
1.LDAP介绍 LDAP是一个基于X.500标准的轻量目录访问协议,与X.500不同,LDAP协议支持TCP/IP连接.全称为Lightweight Directory Access Protoco ...
- 全免费开源-国内搭建ChatGPT个人镜像站与维护全攻略
本教程收集于:AIGC从入门到精通教程汇总 全免费开源,仅需一个域名就可以部署国内的ChatGPT镜像版本. One-Click to deploy well-designed ChatGPT web ...
- Auto-GPT免费尝鲜之初体验-使用攻略和总结
写在前面的废话 ChatGPT 的交互模式,是和一个 "人" 对话聊天. 如果你想了解更多ChatGPT和AI绘画的相关知识,请参考:ChatGPT注册和变现思路,AI绘画教程汇总 ...
- Redis系列22:Redis 的Pub/Sub能力
Redis系列1:深刻理解高性能Redis的本质 Redis系列2:数据持久化提高可用性 Redis系列3:高可用之主从架构 Redis系列4:高可用之Sentinel(哨兵模式) Redis系列5: ...
- minio 支持object搜索方案
minio支持上传时对object打标签,查询时可以根据标签做筛选.但是有ftp上传文件的需求,导致无法给object打标签.并且也不清楚minio对于根据标签的筛选性能如何,因此我们打算将objec ...
- 创建Anaconda虚拟Python环境的方法
本文介绍在Anaconda环境下,创建.使用与删除Python虚拟环境的方法. 在Python的使用过程中,我们常常由于不同Python版本以及不同第三方库版本的支持情况与相互之间的冲突情况, ...
- Go类型全解:常量与变量大全!
本篇文章深入探讨了 Go 语言中类型确定值.类型不确定值以及对应类型转换的知识点,后续充分解析了常量与变量及其高级用法,并举出丰富的案例. 关注公众号[TechLeadCloud],分享互联网架构.云 ...
- window 安装多个低版本chrome测试
最近在用next13做一个简单的项目,需要兼容chrome 60+以上版本,为了方便测试,特意在公司的台式机上安装了低版本. 这里简单记录下高版本覆盖低版本的问题,这个方法不影响Windows系统内已 ...
- CH59X/CH58X/CH57X PWM使用
以CH582M为例: CH582M有4+8组PWM这里的4路26位PWM(定时器提供),8路系统PWM(8位) 先看系统提供的PWM: 下列截图根据例程进行测试的 注:如需要使用PWM11则需要通过i ...



