zoukankan      html  css  js  c++  java
  • 使用QT创建系统托盘

    使用QT来创建一个系统托盘,事实上是一件很简单的事。为什么这么说?一是因为QT文档给出了比较详细的例子,二是QT的结构比较优雅,设计风格统一。但是在动手之前,我们要从哪里下手?虽然QT文档给出了一个比较详细的例子,但由于功能较多,所以看起来比较费劲。我们在这只是抽丝剥茧,只实现系统托盘这一个功能。

    首先,使用QT creator创建一个GUI工程,继承于QDialog还是QMainWindow还是QWidget都无所谓。我们以继承QMainWindow为例说明。创建完毕之后,creator将自动生成一些文件,工程文件如下:

    打开头文件mainwindow.h。在类声明中添加一些必要的成员变量,如下图所示:

    其中:closeEvent()是父类中的一个虚函数。我们在这里将它重写来,以实现程序窗口关闭时的一些动作。然后后声明了一个QSystemTrayIcon类型的指针,这是实现系统托盘的一个主要类。然后声明了四个QAction类型的指针,以及一个QMenu类型的指针,它们将合作实现系统托盘的上下文菜单。好了,我们仅仅只是实现系统托盘的功能,所以添加这些成员就已经足够了。

    一般,我们会看到系统托盘处都有一个小图标代表程序处于后台运行。那么,我们也添加一个小图标来作为我们程序的系统托盘图标。这一步很简单:先在源代码的文件夹中建立一个子文件夹,比如命名为images.然后在工程中添加一个资源文件。打开这个资源文件,在右边下部可以看到一个添加的按钮,点击添加前缀,如图:

    添加前缀的时候要注意,默认生成的前缀是:/new/prefix1,我们把后面的文字都去掉,只保留'/'。这是为了简便处理。之后,再次点击“添加”按钮,这次选择“添加文件”。在打开的文件对话框中,我们选择先前建立的images文件夹中的一个图标,点击确定后结果如图:

    添加图标的过程到此结束。

    下面就转到mainwindow.cpp文件来进行实际代码的编写。一般和窗口组件初始化的代码,我们都放到主窗口的构造函数中,以便窗口在创建时就将必要的组件初始化好。这里我们就在MainWindow类中进行实现。看代码:

    复制代码
     1     QIcon icon(":/images/sysTray.ico");
     2     systemTray = new QSystemTrayIcon(this);
     3     systemTray->setIcon(icon);
     4     systemTray->setToolTip("Test Radio Buttons");
     5     minimumAct = new QAction("Minimum Window", this);
     6     //Note the differences between hide() and showMinimized().
     7     connect(minimumAct, SIGNAL(triggered()), this, SLOT(hide()));
     8     maximumAct = new QAction("Maximum Window", this);
     9     connect(maximumAct, SIGNAL(triggered()), this, SLOT(showMaximized()));
    10     restoreAct = new QAction("Restore Window", this);
    11     connect(restoreAct, SIGNAL(triggered()), this, SLOT(showNormal()));
    12     quitAct = new QAction("Quit Application", this);
    13     connect(quitAct, SIGNAL(triggered()), qApp, SLOT(quit()));
    14     pContextMenu = new QMenu(this);
    15     pContextMenu->addAction(minimumAct);
    16     pContextMenu->addAction(maximumAct);
    17     pContextMenu->addAction(restoreAct);
    18     pContextMenu->addSeparator();
    19     pContextMenu->addAction(quitAct);
    20     systemTray->setContextMenu(pContextMenu);
    21     systemTray->show();
    复制代码

    我们逐行进行讲解:第1行使用图标的文件路径生成一个QIcon对象,这是给QSystemTrayIcon的setIcon用的,用来设置系统托盘图标。第4行设置提示信息。这个提示信息出现在什么时候呢?就是当你的鼠标放在系统托盘图标上时,它就会出现。一般设置为程序名称。第5行到第13行设置上下文菜单项。这里总共设置了四项。分别为缩小、放大、还原窗口和推出程序。每一个菜单项在创建后,我们就将其触发信号连接到指定的槽函数。第14到20行将创建好的菜单项添加到上下文菜单中去,搞定。第21行将这个系统托盘显示出来。这一句很重要,不能忘记。否则在系统托盘区将看不到图标。
    这时功能基本完成,程序在一启动时就可以在系统托盘区看到托盘图标。但是如果在上述构造函数中没有加showMessage()这个函数,将不会出现托盘气球提醒。我们就模仿程序后台运行时的提醒效果吧。那么,我们只需重写closeEvent()事件即可。如下编写代码:

        if(systemTray->isVisible())
        {
            hide();
            systemTray->showMessage("Tips", "The program is running behind!");
            event->ignore();
        }
    

    if语句首先对托盘可见性进行判断。由于我们在构造函数中已经调用了show()函数,所以此时系统托盘图标是可见的。于是进入if语句。首先将主窗口进行隐藏,然后调用QSystemTrayIcon的showMessage()函数显式托盘气球提醒。最后调用ignore()函数忽略事件,以防止该事件继续传递。效果如下图:

      

    功能完成,再看看上下文菜单的样子:

    至此,简单的系统托盘功能完成。

  • 相关阅读:
    Jenkins和Postman 集成,使用Allure 输出测试报告
    Jenkins 中使用VSTest.console 进行单元测试,使用Allure 输出测试报告
    如果网页中有ShawdowDOM ,如何使用 Selenium Web Driver 进行操作
    postman 不能打开
    chrome DEvTools 使用
    使用selenium 连接到一个已经打开的浏览器
    如何查看电脑开关机时间
    Task.Wait() 和 await Task 的区别
    已经过了1/3的2020
    Laravel7 配置jwt ,并处理 Unauthorized 错误
  • 原文地址:https://www.cnblogs.com/yezuhui/p/6844682.html
Copyright © 2011-2022 走看看