qt系统托盘显示、无主窗体

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

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

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

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

 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秒弹出一个提示,大家也可以根据自己的需求来在合适的时机弹出提示?

时间: 2024-11-09 06:57:48

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

Qt 系统托盘(加hover效果)

最近项目需要添加系统托盘,本来Qt的QSystemTrayIcon可以实现的,但是要求要添加hover效果,并显示未读消息(就和qq的托盘差不多,移动上去显示未读列表),加了这个要求QSystemTrayIcon就没法实现了,最后使用的是NOTIFYICONDATA实现的,记录下. 1.创建一个系统托盘: NOTIFYICONDATA m_nid; CMsgTrayPos m_traypos; QLabel *m_pSysIcon; qApp->installNativeEventFilter(

Qt系统托盘

Qt的系统托盘的使用,可比mfc中好多了!他封装了一个专门的QSystemTrayIcon类,建立系统托盘图标.其实在Qt提供的示例程序已经很不错了,$QTDIR\examples\desktop\systray在这里简单的实现一个系统托盘功能,对其系统托盘类的使用做以演示. #include <QtGui>class Window: public QWidget{    Q_OBJECT        public:    Window(); private:    void showMes

QT程序系统托盘

QT托盘用到的类为:QSystemTrayIcon 一.托盘对象创建 1 //最小化到系统托盘的类 2 my_system_tray = new QSystemTrayIcon(this); 3 //设置显示图标 4 QIcon ico(":/1.png"); 5 my_system_tray->setIcon(ico); 6 //设置显示文字 7 my_system_tray->setToolTip("剑来"); 8 //链接最小化托盘类的点击事件信号

【Qt编程】系统托盘的显示

本文主要讨论Qt中的系统托盘的设置.系统托盘想必大家都不陌生,最常用的就是QQ.系统托盘以简单.小巧的形式能让人们较快的打开软件.废话不多说,下面开始具体介绍. 首先,新建一个Qt Gui项目,类型选择QMainWindow,类名也选择默认的mainwindow.这时,工程项目中就有3个文件(界面文件不用管):mainwindow.h mainwindow.cpp main.cpp.然后,分别修改3个文件如下: 1.mainwindow.h #ifndef MAINWINDOW_H #defin

Qt 实现系统托盘,托盘菜单,托盘消息

Qt 实现系统托盘,托盘菜单,托盘消息 系统托盘就是运行的某个程序在电脑右下角的小图标,相信大家都很熟悉.QT 提供了QSystemTrayIcon类用于实现程序的托盘.QT提供了托盘示例,在examples文件夹下面,大家可以自行研究. 下面是我自己进行实现的一个示例,主要实现的功能: 1.托盘显示,托盘图标添加: 2.托盘激活事件分发: 3.托盘菜单: 4.托盘消息,点击消息,显示主窗口. 想要显示 托盘图标,首先需要创建一个QSystemTrayIcon对象.可以给此对象设置一些信息,比如

Qt实现系统托盘

        平时大多数看到的软件都是带系统托盘的,这样软件可以在后台运行,挺好的.今天看了下Qt自带的demon,中间有参考了下,实现了这个小小的功能,就将这个功能添加到了自己之前的一个项目中,效果蛮好的.界面如下所示: 右击系统托盘就会显示当前设定的各个菜单功能: 怎么样,效果还好吧.实现这个小功能厅满意的.右键点击弹出的菜单可以自行设定所需的.另外可以设定鼠标单击.双击.中间键分别按下时所触发的动作.主要代码如下所示: 1.首先需要添加头文件,Qsystem/trayIcon类.QMen

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

概述 系统托盘就是在系统桌面底部特定的区域显示运行的程序.windows在任务栏状态区域,linux在布告栏区域.应用程序系统托盘功能,是比较普遍的功能,本篇将详细的介绍如何实现该功能. 演示Demo实现功能: 1.应用启动后,任务栏,系统托盘可以看到该程序. 2.点击右上角×关闭窗口,自动隐藏窗口,托盘可以看到该程序. 3.鼠标在托盘图标上右键,弹出"退出程序"菜单栏,并带有图标. 步骤: 1.工程中新建TrayDialog类,基类是QDialog,在界面上添加Text Browse

wpf 让图标显示在系统托盘

上次做wpf时想把程序运行的图标显示在任务栏,结果发现wpf的系统托盘和winform的不一样,以前的方法不管用了. 网上搜的好多都是winform的资料,wpf的很少. 最后我把我现在做好的整理分享下,方便别人,也方便自己. 文章难免有些错误,欢迎指正,下面代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Windows; using System.Windo

使用QT创建系统托盘

使用QT来创建一个系统托盘,事实上是一件很简单的事.为什么这么说?一是因为QT文档给出了比较详细的例子,二是QT的结构比较优雅,设计风格统一.但是在动手之前,我们要从哪里下手?虽然QT文档给出了一个比较详细的例子,但由于功能较多,所以看起来比较费劲.我们在这只是抽丝剥茧,只实现系统托盘这一个功能. 首先,使用QT creator创建一个GUI工程,继承于QDialog还是QMainWindow还是QWidget都无所谓.我们以继承QMainWindow为例说明.创建完毕之后,creator将自动