zoukankan      html  css  js  c++  java
  • 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秒弹出一个提示,大家也可以根据自己的需求来在合适的时机弹出提示​

  • 相关阅读:
    「UVA12293」 Box Game
    「CF803C」 Maximal GCD
    「CF525D」Arthur and Walls
    「CF442C」 Artem and Array
    LeetCode lcci 16.03 交点
    LeetCode 1305 两棵二叉搜索树中的所有元素
    LeetCode 1040 移动石子直到连续 II
    LeetCode 664 奇怪的打印机
    iOS UIPageViewController系统方法崩溃修复
    LeetCode 334 递增的三元子序列
  • 原文地址:https://www.cnblogs.com/swarmbees/p/5621489.html
Copyright © 2011-2022 走看看