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);
View Code

这些代码是为主程序设置了图盘,然后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);
View Code

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

优质内容筛选与推荐>>
1、C++学习笔记11:操作符重载(四则运算符/关系与下标操作符)
2、Bracket 使用指南
3、C#驱动mysql明明数值不为空却一直说DBNull.Value的诡异情况
4、thc--hydra暴力破解
5、mapabc地图,看看是如何获取经纬度和缩放级别吧


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号





    联系我们

    欢迎来到TinyMind。

    关于TinyMind的内容或商务合作、网站建议,举报不良信息等均可联系我们。

    TinyMind客服邮箱:support@tinymind.net.cn