精华内容
下载资源
问答
  • 托盘程序
    千次阅读
    2022-03-11 17:09:32

    Qt系统托盘程序的创建

    一般来说,我们的应用程序都是控制台程序,或者窗口程序,点击应用程序右上角的关闭按钮,就会将程序关闭。但是有些应用,例如微信、或者杀毒软件等等,点击关闭按钮后,只是将程序最小化到右下角的菜单栏而已,并没有关闭程序。而要彻底关闭程序,需要点击右下角对应程序的右键菜单,进行退出。
    那么,这种托盘程序,在QT是怎么实现的呢?
    Qt中,通过类QSystemTrayIcon,实现系统托盘,右键菜单的实现,通过QMenuQAction实现。

    直接上代码
    在这里插入图片描述
    sysTrayIconWidget.h

    #ifndef SYSTRAYICONWIDGET_H
    #define SYSTRAYICONWIDGET_H
    
    #include <QWidget>
    #include <QSystemTrayIcon>
    #include <QMenu>
    #include <QAction>
    #include <QCloseEvent>
    
    QT_BEGIN_NAMESPACE
    namespace Ui { class SysTrayIconWidget; }
    QT_END_NAMESPACE
    
    class SysTrayIconWidget : public QWidget
    {
        Q_OBJECT
    
    public:
        SysTrayIconWidget(QWidget *parent = nullptr);
        ~SysTrayIconWidget() override;
    
    private:
        Ui::SysTrayIconWidget *ui;
    
    
        QSystemTrayIcon *m_sysTrayIcon; //系统托盘
        void initSysTrayIcon();
    
        QMenu *m_menu;                  //菜单
        QAction *m_showMainAction;      //动作
        QAction *m_exitAppAction;       //动作
        void createActions();
        void createMenu();
    
    private slots:
        void on_showMainAction();
        void on_exitAppAction();
    
    protected:
        void closeEvent (QCloseEvent *event) override;
    };
    #endif // SYSTRAYICONWIDGET_H
    
    

    sysTrayIconWidget.cpp

    #include "sysTrayIconWidget.h"
    #include "ui_sysTrayIconWidget.h"
    #include <QMessageBox>
    
    SysTrayIconWidget::SysTrayIconWidget(QWidget *parent)
        : QWidget(parent)
        , ui(new Ui::SysTrayIconWidget)
    {
        ui->setupUi(this);
    
        initSysTrayIcon();
    }
    
    SysTrayIconWidget::~SysTrayIconWidget()
    {
        delete ui;
    }
    
    //创建系统托盘
    void SysTrayIconWidget::initSysTrayIcon()
    {
        //隐藏程序主窗口
        this->hide();
    
        //新建QSystemTrayIcon对象
        m_sysTrayIcon = new QSystemTrayIcon(this);
    
        //设置托盘图标
        QIcon icon = QIcon(":/images/testIcon.png");    //资源文件添加的图标
        m_sysTrayIcon->setIcon(icon);
    
        //当鼠标移动到托盘上的图标时,会显示此处设置的内容
        m_sysTrayIcon->setToolTip("托盘提示信息");
    
        //给QSystemTrayIcon添加槽函数
        connect(m_sysTrayIcon, &QSystemTrayIcon::activated,
                [=](QSystemTrayIcon::ActivationReason reason)
        {
            switch(reason)
            {
            case QSystemTrayIcon::Trigger:
                //单击托盘图标
                m_sysTrayIcon->showMessage(QObject::trUtf8("Message Title"),
                                                  QObject::trUtf8("欢迎使用此程序"),
                                                  QSystemTrayIcon::Information,
                                                  1000);
                break;
            case QSystemTrayIcon::DoubleClick:
                //双击托盘图标
                //双击后显示主程序窗口
                this->show();
                break;
            default:
                break;
            }
        });
    
        //建立托盘操作的菜单
        createActions();
        createMenu();
        //在系统托盘显示此对象
        m_sysTrayIcon->show();
    }
    
    //创建动作
    void SysTrayIconWidget::createActions()
    {
        m_showMainAction = new QAction("关于系统", this);
        connect(m_showMainAction,SIGNAL(triggered()),this,SLOT(on_showMainAction()));
        m_exitAppAction = new QAction("退出", this);
        connect(m_exitAppAction,SIGNAL(triggered()),this,SLOT(on_exitAppAction()));
    }
    
    //创建托盘菜单
    void SysTrayIconWidget::createMenu()
    {
        m_menu = new QMenu(this);
        //新增菜单项---显示主界面
        m_menu->addAction(m_showMainAction);
        //增加分隔符
        m_menu->addSeparator();
        //新增菜单项---退出程序
        m_menu->addAction(m_exitAppAction);
        //把QMenu赋给QSystemTrayIcon对象
        m_sysTrayIcon->setContextMenu(m_menu);
    }
    
    //当在系统托盘点击菜单内的显示主界面操作
    void SysTrayIconWidget::on_showMainAction()
    {
        QApplication::setQuitOnLastWindowClosed( false );
        QMessageBox::information(nullptr, "xxxx", "xxxx有限公司copyright©2022");
    }
    
    //当在系统托盘点击菜单内的退出程序操作
    void SysTrayIconWidget::on_exitAppAction()
    {
        qApp->exit();
    }
    
    //关闭事件
    void SysTrayIconWidget::closeEvent(QCloseEvent *event)
    {
        //忽略窗口关闭事件
        QApplication::setQuitOnLastWindowClosed( true );
        this->hide();
        event->ignore();
    }
    
    

    需要注意的是:一定要在closeEvent()中忽略关闭窗口关闭事件,否则,点击右上角的关闭按钮后,还是会退出程序。

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/b538a178e65149c7a046e6e0cb7cf718.png在这里插入图片描述

    在这里插入图片描述

    更多相关内容
  • 最近有同学咨询如何用wx写任务托盘程序,也有同学咨询怎样创建wx的异形窗口。恰好,我也正需要一个可以将屏幕显示或者操作录制成gif文件的工具。于是乎,结合同学们的问题,我用wx写了一个屏幕录像机代码,既包含...
  • MFC开机自启动设置,显示为托盘程序,双击托盘,显示窗口,单击右键,显示子菜单,采用VS2013 VC++编程
  • 易语言取托盘程序

    2020-07-16 10:25:09
    易语言取托盘程序源码,取托盘程序,取托盘句柄,取隐藏按钮句柄,模拟鼠标,按键,GetInfo,FindWindow,FindWindowEx,SendMessage,GetWindowRect,GetWindowThreadProcessId,OpenProcess,DuplicateHandle,GetCurrentProcess...
  • 摘要:C#源码,系统相关,托盘,任务栏图标 C#系统托盘程序示例源代码,知识点:  1、添加一个 NotifyIcon 组件和一个 ContextMenuStrip组件到主窗体  2、设置notifyIcon1控件的ContextMenuStrip属性为 ...
  • C#托盘程序的实现

    2013-11-26 15:09:42
    C#托盘程序的实现,为什么说用VisualC#可以十分方便的做一个托盘程序,主要的原因是在.Net框架的软件开发包( .Net FrameWork SDK)中的WinForm组件中定义了一个专门用来开发托盘程序的组件--NotifyIcon组件。...
  • 用VB实现屏幕右下角的托盘图标,一个显示托盘的气泡提示程序源码,鼠标放在托盘的图标上,会弹出像Windows XP系统中的托盘提示,一个很漂亮的气泡文字,鼠标移走后会自动消失,在各大VB开发的应用程序中,似乎你都...
  • 27.如何制作托盘程序?(Visual C++编程 源代码)27.如何制作托盘程序?(Visual C++编程 源代码)27.如何制作托盘程序?(Visual C++编程 源代码)27.如何制作托盘程序?(Visual C++编程 源代码)27.如何制作托盘...
  • 易语言取托盘程序源码
  • winform托盘程序

    2018-08-17 11:40:43
    winform托盘程序
  • Labview制作托盘程序

    2019-01-17 16:23:19
    之前想使LABVIEW编写的程序也能像QQ那样在最小化的时候进入托盘,下面是labview使用.NET程序集调制作托盘程序
  • 托盘程序

    2013-01-11 20:36:43
    托盘程序
  • 主要介绍了C#实现托盘程序并禁止多个应用实例运行的方法,涉及C#中NotifyIcon控件的使用及设置标志位控制程序只运行一个的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
  • VisualC 实效编程 55 系统托盘程序VisualC 实效编程 55 系统托盘程序VisualC 实效编程 55 系统托盘程序VisualC 实效编程 55 系统托盘程序VisualC 实效编程 55 系统托盘程序VisualC 实效编程 55 系统托盘程序VisualC ...
  • vs2010开发的c++托盘程序
  • 托盘程序实现

    2018-03-26 21:07:02
    编写Windows窗口程序最小化到托盘的技术细节, 以及相关的结构与消息等.
  • Ubuntu 托盘程序 开发

    千次阅读 2022-03-10 17:44:17
    托盘图标开发包安装: sudo apt-get install -y libappindicator3-dev 程序编译 sudo gcc `pkg-config --cflags gtk+-3.0` hello.c -o hello `pkg-config --libs gtk+-3.0` 普通用户编译可能会造成 (.text+0x18)...

    开发环境搭建

    • Ubuntu 14 Desktop
      • Lib GTK3
      • Lib Appindicator3

    GTK3开发环境安装:

    sudo apt-get install libgtk-3-dev make gcc pkg-config
    

    托盘图标开发包安装:

    sudo apt-get install -y libappindicator3-dev
    

    GTK Hello World!

    首先我们来尝试一下由GTK程序的Hello World,创建一个标题为"Window" 的GTK窗口

    #include <gtk/gtk.h>
    
    int main (int argc, char *argv[]){
        GtkWidget *window;
        gtk_init (&argc, &argv);
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
        gtk_window_set_title (GTK_WINDOW (window), "Window");
        g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
        gtk_widget_show (window);
        gtk_main ();
        return 0;
    }
    

    程序编译

    sudo gcc `pkg-config --cflags gtk+-3.0` hello.c -o hello `pkg-config --libs gtk+-3.0`
    

    普通用户编译可能会造成 (.text+0x18):对‘main’未定义的引用 错误

    在这里插入图片描述
    到这里我们已经证明了我们的开发环境已经可用。

    托盘程序

    我们需要创建一个如下的状态栏图标程序:

    在这里插入图片描述

    托盘程序使用GTK和appindicator3 API实现,使用GTK创建UI主程序和提供菜单,使用libappindicator创建状态栏的图标。

    main.c 示例代码如下:

    #include <stdio.h>
    #include <gtk/gtk.h>
    #include <libappindicator/app-indicator.h>
    #include <string.h>
    
    #define APPINDICATOR_ID "MyFirstTrayApp"
    #define ICON "/tmp/tmp.MV7CyDttpW/cmake-build-debug/icon.ico"
    
    
    /**
     * 创建菜单
     * @return 菜单
     */
    GtkMenuShell *create_menu();
    
    int main() {
        AppIndicator *indicator      = NULL;
        GtkMenuShell *indicator_menu = NULL;
    
        // 1. 初始化GTK
        if (gtk_init_check(0, NULL) == FALSE) {
            return -1;
        }
        //  2. app-indicator 创建应用程序状态栏的图标
        //  注意:图标文件名必须是绝对路径否则会出现无法显示问题。
        indicator = app_indicator_new(APPINDICATOR_ID, ICON,
                                      APP_INDICATOR_CATEGORY_APPLICATION_STATUS);
        app_indicator_set_status(indicator, APP_INDICATOR_STATUS_ACTIVE);
        // 设置图标
        app_indicator_set_icon(indicator, ICON);
        // 3. 初始化菜单项
        indicator_menu = create_menu();
        // 4. 关联到状态栏
        app_indicator_set_menu(indicator, GTK_MENU (indicator_menu));
        // 5. 启动GTK程序,并阻塞进程。
        gtk_main();
        return 0;
    }
    
    /**
     * 按钮回调函数
     */
    void hello_cb(GtkMenuItem *item, gpointer data) {
        printf(">> Hello world!\n");
    }
    
    GtkMenuShell *create_menu() {
        GtkWidget    *hello_item;
        GtkWidget    *quit_item;
        GtkMenuShell *indicator_menu;
    
        indicator_menu = (GtkMenuShell *) gtk_menu_new();
    
        hello_item = gtk_check_menu_item_new_with_label("你好!");
        // 菜单项定义
        // gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(hello_item), FALSE);
        // 表示可交互
        // gtk_widget_set_sensitive(hello_item, TRUE);
        // 设置点击事件回调函数
        g_signal_connect(hello_item, "activate", G_CALLBACK(hello_cb), NULL);
    
    
        quit_item = gtk_check_menu_item_new_with_label("退出");
        // gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(quit_item), FALSE);
        // gtk_widget_set_sensitive(quit_item, TRUE);
        g_signal_connect(quit_item, "activate", G_CALLBACK(gtk_main_quit), NULL);
    
        // 显示菜单项目,并添加到菜单中。
        gtk_widget_show(hello_item);
        gtk_widget_show(quit_item);
        gtk_menu_shell_append(indicator_menu, hello_item);
        gtk_menu_shell_append(indicator_menu, quit_item);
    
        return indicator_menu;
    }
    

    注意:图标文件名必须要是绝对路径,否则图标无法显示!

    1. 初始GTK。
    2. 使用Appindicator3 API 创建并初始化Appindicator。
    3. 使用GTK创建菜单,并把菜单关联到Appindicator,菜单包含两个功能,控制台打印字符串、退出程序。
    4. 启动程序。

    编译程序

    sudo gcc `pkg-config --cflags gtk+-3.0 appindicator3-0.1` main.c -o main `pkg-config --libs gtk+-3.0 appindicator3-0.1`
    

    运行程序

    在这里插入图片描述

    CMake进行项目管理

    CMake可以非常方便的对C/C++工程进行管理,减少编译连接对开发者的负担,使用上面程序作为工程文件,创建一个CMake项目。

    首先,安装CMake:

    sudo apt-get install cmake
    
    1. 创建目录UbuntuTray
    2. 把刚才创建的main.cicon.ico文件复制到目录中。
    3. 创建CMakeLists.txt

    如下所示:

    在这里插入图片描述

    CMakeLists.txt内容:

    cmake_minimum_required(VERSION 2.8)
    project(UbuntuTray C)
    
    set(CMAKE_C_STANDARD 99)
    
    add_executable(main main.c)
    

    如果是一个普通程序,那么上面内容表示生成编译生成一个名为main的可执行程序。

    由于我们的程序使用到了gtk+-3.0appindicator3两个库,编译时使用需要指明头文件位置,连接时需要指明需要连接的动态库。

    之前gcc编译命令中,我们使用pkg-config程序来查找这2个库的头文件(pkg-config --cflags参数)和动态库(pkg-config --libs参数)。

    在CMake中我们需要使用下面语法来进行查找和使用

    完整的CMakeLists.txt内容:

    cmake_minimum_required(VERSION 2.8)
    project(UbuntuTray C)
    
    set(CMAKE_C_STANDARD 99)
    
    # pkg-config --cflags gtk+-3.0 appindicator3-0.1
    # pkg-config --libs   gtk+-3.0 appindicator3-0.1
    find_package(PkgConfig REQUIRED)
    pkg_check_modules(GTK3 REQUIRED gtk+-3.0)
    pkg_check_modules(AppI3 REQUIRED appindicator3-0.1)
    
    # 添加头文件目录
    include_directories(${GTK3_INCLUDE_DIRS} ${AppI3_INCLUDE_DIRS})
    # 添加链接库目录
    link_directories(${GTK3_LINK_LIBRARIES} ${AppI3_LINK_LIBRARIES})
    
    add_executable(main main.c)
    # 可执行程序链接库
    target_link_libraries(main ${GTK3_LIBRARIES} ${AppI3_LIBRARIES})
    
    • 首先使用find_package(PkgConfig REQUIRED)引入pkg-config,请确保已经在系统中安装pkg-config
    • 使用pkg_check_modules(变量名 REQUIRED 包名称) 查找相关的模块,如果模块存在那么会以变量名 作为前缀设置一些列的变量,如:头文件路径 _INCLUDE_DIRS、依赖包_LIBRARIES
    • 接下来添加使用之前设置变量来添加头文件和链接库的目录。
    • 最后为可执行程序链接冬天库。

    创建用于构建的目录,并运行cmake构建Makefile等相关文件

    mkdir build
    cd build/
    cmake ..
    

    运行后会在build目录生成构建相关的文件

    在这里插入图片描述

    可以看到已经生成了Makefile,我们接下来我们使用make命令编译程序即可:

    make
    

    可以看到我们的main可执行程序已经编译完成

    在这里插入图片描述

    运行程序可以看到与我们之前使用gcc命令编译的程序一样效果。

    参考文献

    [1]. ubuntu . ApplicationIndicators . https://wiki.ubuntu.com/DesktopExperienceTeam/ApplicationIndicators
    [2]. gtk . gtk3 . https://docs.gtk.org/gtk3/
    [3]. 博客园 . 用cmake构建gtk程序 . ChrisZZ . 2019.06 . https://www.cnblogs.com/zjutzz/p/10959211.html
    [4]. 空心菜 . cmake使用pkg-config配置工程依赖 . 2021.03 . https://kxcblog.com/post/dev/cmake-pkg-config/
    [5]. github . Serge Zaitsev . zserge/tray . https://github.com/zserge/tray
    [6]. github getlantern . getlantern/systray . https://github.com/getlantern/systray

    展开全文
  • 托盘程序_托盘_

    2021-09-30 06:43:04
    C# 托盘程序 ( 含右小角气泡提示 )。
  • 托盘程序示例

    2014-05-16 10:26:52
    你的托盘程序就拥有一个菜单了。 需要说明的是,我的Form1有一个Bool型私有变量CloseTag,另外我的程序有一个关闭按钮,该按钮才是真正的关闭程序。我的做法是当使用我的关闭按钮时将CloseTag设为True,否则CloseTag...
  • 使用系统托盘作为用户界面的Windows应用程序数不胜数,比如"金山词霸"、"Winamp"、"RealPlayer"等等。  这些程序运行时不显示运行窗口,只在任务栏上显示一个图标,表示程序正在运行,用户可以通过鼠标与应用程序...
  • systray4j-2.4.1-win32.zip包 博文链接:https://ritaleo.iteye.com/blog/39693
  • Delphi托盘程序一个记事提醒软件..rar
  • VB托盘程序详解.doc

    2022-03-13 17:19:44
    VB托盘程序详解
  • 结束一个托盘程序进程后,但是windows任务栏托盘区的图标还在,鼠标移上去后图标就消失了 这是为什么 怎么解决.zip
  • PB托盘程序

    2014-05-14 22:00:41
    startx的托盘程序
  • 商业编程-源码-一个托盘程序演示-闹钟 Alert.zip

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 26,332
精华内容 10,532
关键字:

托盘程序