qt系统托盘显示、无主窗体
系统图盘是应用程序经常用到的一个控件,当应用程序需要长时间存在的时候,这个控件会变得非常有用,比如,窗口隐藏,显示,关于、关闭等接口都可以放在图盘中处理,今天与到一个问题,需求是这样的:只需要显示图盘,不需要主窗口,提示信息需要动态的改变
看似很简单的一个问题,我自己试了试之后,也倒腾了好一会儿,先看我的第一版程序,代码如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 QSystemTrayIcon *tc = new QSystemTrayIcon; 2 3 tc->setToolTip(QStringLiteral("消息提示")); 4 5 tc->setIcon(style()->standardIcon(QStyle::SP_TitleBarNormalButton)); 6 7 tc->show(); 8 9 QMenu * menu = new QMenu; 10 11 QAction * aboutAct = menu->addAction(QStringLiteral("关于")); 12 13 connect(aboutAct, &QAction::triggered, this, []{ 14 15 QWindow * w = new QWindow; 16 17 w->show(); 18 19 }); 20 21 tc->setContextMenu(menu);
这些代码是为主程序设置了图盘,然后main函数中只需要new一个窗口,图盘就自然显示了,因为图盘自己show了。
不过这样是有问题的,当操作右键菜单事件(关于)后,关闭弹出的菜单,图盘也会随之消息,主程序结束,个人人为是主程序的消息循环退出了导致图盘退出的,然后想办法,试了以下几种方式;
1、main函数中显示窗口,并设置窗口无任务栏图标和最小化:图盘还是会消失
2、main函数显示, 不做任何窗口设置:不消失
方法2的目的其实就是不让主线程的消息循环退出,那我们就朝着这个方向前进,把主窗体背景色设置透明,问题就迎刃而解了,经过测试,果然可以,代码如下:
w->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint );
w->setAttribute(Qt::WA_TranslucentBackground);
注意:窗口如果为QMainWindow,需要手动去掉工具栏和状态栏
其实还有一种办法,不过个人不建议使用,那就是在消息循环结束后立刻重启一个消息循环,总之就是主线程不退出,代码如下:
int ret = 0;
while (true)
{
ret = a.exec();
}
return a.exec();
最后更改气泡提示的方法比较简单,代码如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 QTimer * timer = new QTimer(this); 2 3 connect(timer, &QTimer::timeout, this, [tc]{ 4 5 static size_t i = 0; 6 7 tc->showMessage(QStringLiteral("我是标题%1").arg(i++) 8 9 , QStringLiteral("我是内容...") 10 11 , QSystemTrayIcon::Information, 1000); 12 13 }); 14 15 timer->start(1000);
我是使用了一个定时器,每隔1秒弹出一个提示,大家也可以根据自己的需求来在合适的时机弹出提示
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· .NET中 泛型 + 依赖注入 的实现与应用