系统图盘是应用程序经常用到的一个控件,当应用程序需要长时间存在的时候,这个控件会变得非常有用,比如,窗口隐藏,显示,关于、关闭等接口都可以放在图盘中处理,今天与到一个问题,需求是这样的:只需要显示图盘,不需要主窗口,提示信息需要动态的改变

看似很简单的一个问题,我自己试了试之后,也倒腾了好一会儿,先看我的第一版程序,代码如下

 QSystemTrayIcon *tc = new QSystemTrayIcon;

 tc->setToolTip(QStringLiteral("消息提示"));

 tc->setIcon(style()->standardIcon(QStyle::SP_TitleBarNormalButton));

 tc->show();

 QMenu * menu = new QMenu;

 QAction * aboutAct = menu->addAction(QStringLiteral("关于"));

 connect(aboutAct, &QAction::triggered, this, []{

 QWindow * w = new QWindow;

 w->show();

 });

 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();

​    最后更改气泡提示的方法比较简单,代码如下:

 QTimer * timer = new QTimer(this);

 connect(timer, &QTimer::timeout, this, [tc]{

 static size_t i = ;

 tc->showMessage(QStringLiteral("我是标题%1").arg(i++)

 , QStringLiteral("我是内容...")

 , QSystemTrayIcon::Information, );

 });

 timer->start();

我是使用了一个定时器,每隔1秒弹出一个提示,大家也可以根据自己的需求来在合适的时机弹出提示​

qt系统托盘显示、无主窗体的更多相关文章

  1. QT系统托盘应用程序

    在QT中QSystemTrayIcon类提供了创建系统托盘程序的功能. QSystemTrayIcon类为系统托盘中的应用程序提供图标.现代操作系统通常会在桌面上提供一个称为系统托盘(system t ...

  2. WinForm 程序在系统托盘显示

    前言 有些程序在关闭或最小化的时候会隐藏在系统托盘中,双击或右击会重新显示,winform实现其功能很简单,这边就简单的介绍下. 实现 在winform实现托盘使用notifyIcon控件,如果加菜单 ...

  3. Qt系统托盘

    Qt的系统托盘的使用,可比mfc中好多了!他封装了一个专门的QSystemTrayIcon类,建立系统托盘图标.其实在Qt提供的示例程序已经很不错了,$QTDIR\examples\desktop\s ...

  4. 【Qt编程】基于Qt的词典开发系列<十一>系统托盘的显示

    本文主要讨论Qt中的系统托盘的设置.系统托盘想必大家都不陌生,最常用的就是QQ.系统托盘以简单.小巧的形式能让人们较快的打开软件.废话不多说,下面开始具体介绍. 首先,新建一个Qt Gui项目,类型选 ...

  5. 用Qt写软件系列四:定制个性化系统托盘菜单

    导读 一款流行的软件,往往会在功能渐趋完善的时候,通过改善交互界面来提高用户体验.毕竟,就算再牛逼的产品,躲藏在糟糕的用户界面之后总会让用户心生不满.界面设计需综合考虑审美学.心理学.设计学等多因素, ...

  6. 【Qt开发】实现系统托盘,托盘菜单,托盘消息

    概述 系统托盘就是在系统桌面底部特定的区域显示运行的程序.windows在任务栏状态区域,linux在布告栏区域.应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能. 演示Demo ...

  7. QT中自定义系统托盘的实现—c++语言为例

    将要介绍的是:QT中自定义系统托盘(systemtray)的一个Demo,希望能帮需要的读者快速上手. 前提假设是诸位已经知道QT中的signals .slot以及资源文件,所以关于这些不会再累述. ...

  8. 使用QT创建系统托盘

    使用QT来创建一个系统托盘,事实上是一件很简单的事.为什么这么说?一是因为QT文档给出了比较详细的例子,二是QT的结构比较优雅,设计风格统一.但是在动手之前,我们要从哪里下手?虽然QT文档给出了一个比 ...

  9. Electron实用技巧-开机启动时隐藏主窗口,只显示系统托盘

    # 1 在桌面软件中,开机自启动是很常见的功能,在electron中也提供了很好的支持,以下是主要代码: //应用是否打包if (app.isPackaged) {  //设置开机启动  app.se ...

随机推荐

  1. shiro登录密码加密

    密码加密 String passwd = new SimpleHash("SHA-1", "username", "password").t ...

  2. 网络攻击技术:SQL Injection(sql注入)

    网络攻击技术开篇——SQL Injection   1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码 ...

  3. DBUtils - Python数据库连接池

    flask没有ORM操作这一功能, 但是想要操作数据库怎么办呢, 使用第三方包DBUtils 查询需要SQL原生语句! DBUtils 第一步还是要下载 使用pycharm直接搜索DBUtils fr ...

  4. 【2019雅礼集训】【可持久化线段树】【模型转化】D1T2Permutation

    目录 题意 输入格式 输出格式 思路 代码 题意 给定一个长度为n的序列A[],你需要确定一个长度为n的排列P[],定义当前排列的值为: \[\sum_{i=1}^{n}{A[i]P[i]}\] 现在 ...

  5. 快速安装puppeteer (跳过安装Chromium)

    npm i --save puppeteer --ignore-scripts

  6. On the Optimal Approach of Survivable Virtual Network Embedding in Virtualized SDN

    Introduction and related work 云数据中心对于虚拟技术是理想的创新地方. 可生存性虚拟网络映射(surviavable virtual network embedding ...

  7. Tensor基本操作

    Tensor(张量) 1.Tensor,又名张量,从工程角度来说,可简单地认为它就是一个数组,且支持高效的科学计算.它可以是一个数(标量).一维数组(向量).二维数组(矩阵)或更高维的数组(高阶数组) ...

  8. Linux--Linux下安装JDk

    好不容易免费使用了服务器,还不会安装JDK,记录一下怎么弄. 方法一:远程服务器可以联网下载(高级货) 命令: wget -c -P /root/jdk --no-check-certificate ...

  9. typescript 安装

    1,全局安装 cnpm install typescript -g (tsc -v) 2,初始化 tsc --init 3,自动编译(hbuilder) 工具-插件安装-浏览eclipse插件市场-搜 ...

  10. 封装ajax原理

    封装ajax原理 首先处理 用户如果不传某些参数,设置默认值 type默认get 默认url为当前页 默认async方式请求 data数据默认为{} 处理用户传进来的参数对象 遍历,拼接成key=va ...