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.增加变量 ...
随机推荐
- [MAUI]在.NET MAUI中实现可拖拽排序列表
.NET MAUI 中提供了拖放(drag-drop)手势识别器,允许用户通过拖动手势来移动控件.在这篇文章中,我们将学习如何使用拖放手势识别器来实现可拖拽排序列表.在本例中,列表中显示不同大小的磁贴 ...
- 表格JS实现在线Excel的附件上传与下载
摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 在本地使用Excel时,经常会有需要在Excel中添加一 ...
- 【升职加薪秘籍】我在服务监控方面的实践(7)-业务维度的redis监控
大家好,我是蓝胖子,关于性能分析的视频和文章我也大大小小出了有一二十篇了,算是已经有了一个系列,之前的代码已经上传到github.com/HobbyBear/performance-analyze,接 ...
- BeanUtils.copyProperties:曾经是我的女神,现在是我的毒药。
前言 BeanUtils.copyProperties十有八九是你这些年工作中用的很多的其中一个,不管是Apache的还是Spring的. 网上的解释浩如烟海,我这边用一个超简单的例子直观展示给你看. ...
- Netease研发实习生一面
最想去的公司和部门..今天终于面了,感觉跪了..实质性的问题的确打得不好..庆幸的是拿到了B公司的offer,实习是不愁了.. 记下问题,希望对之后的同学有一定帮助. 问的问题总结: 1.进程线程协程 ...
- 银河麒麟使用kickstart二次打包制作安装镜像ISO
系统:银河麒麟 V10 SP2 服务器:百信恒山 TS02F-F30 安装方式:服务器挂载ISO镜像进行安装 1.安装 mkisofs 软件包: #yum install genisoimage 2. ...
- 微信Native支付(扫码支付)商户配置
0.需要从商户平台获取/设置的配置 公众号appId 商户号 APIv3密钥 证书序列号 证书密钥 1.扫码登录商户平台 网址:https://pay.weixin.qq.com/ 2.确认已开通Na ...
- Solution -「洛谷 P6287」「COCI 2016-2017」Mag
Description Link. 定义一条链的价值为链上点权乘积除以节链上点数,求一条价值最小的链. Solution 结论:答案链上最多包含一个 \(2\)(其余全为 \(1\)),并且不在链的两 ...
- redis基本数据类型 set类型
127.0.0.1:6379> SADD s1 a b c (integer) 3 127.0.0.1:6379> SMEMBERS s1 1) "b" 2) &quo ...
- JAVA中三种I/O框架——BIO、NIO、AIO
一.BIO(Blocking I/O) BIO,同步阻塞IO模型,应用程序发起系统调用后会一直等待数据的请求,直至内核从磁盘获取到数据并拷贝到用户空间: 在一般的场景中,多线程模型下的BIO是成本较低 ...



