QT5.8-程序最小化到托盘

来源:互联网 发布:x77论坛大陆永久域名 编辑:程序博客网 时间:2024/05/17 00:13

对于类似于后台服务的界面非常简单的程序,不需要总显示UI界面,最小化至托盘就是比较好的一个选择.

第一步:实现程序启动直接最小化至托盘图标.
1.新建一个QT项目(本例基类QQWidget,其他基类类似), 不勾选生成ui文件.
2.寻找一个图标文件(icon.ico),以供程序在托盘显示.向项目中添加一个资源文件,并添加prefix包含图标文件.
这里写图片描述
3.修改main.cpp中的w.show()为w.hide().托盘图标功能主要使用QSystemTrayIcon类,向窗口头文件中添加代码:

#include <QWidget>#include <QSystemTrayIcon>class main_win : public QWidget{    Q_OBJECTpublic:    main_win (QWidget *parent = 0);    ~main_win ();private:    QSystemTrayIcon *m_tray_icon;};

4.在CPP文件中,修改构造函数,并添加槽函数的实现:

#include "main_win .h"main_win ::main_win (QWidget *parent)    : QWidget(parent){    QIcon icon = QIcon(":/icons/tray_icon/images/ico_32X32.ico");    setWindowIcon(icon);    this->m_tray_icon = new QSystemTrayIcon(this);    m_tray_icon->setIcon(icon);    m_tray_icon->setToolTip(trUtf8("数据上传程序"));    m_tray_icon->show();}main_win ::~main_win (){}

此时启动程序已经可以在托盘看到图标,并且任务栏也没有对应的程序图标.不过,此时对托盘图标不能做任何操作,只能在任务管理器里强制关闭进程.所以,我们需要进行改进.

第二步:给托盘图标添加双击显示主界面的功能
1.继续修改main_win.h, 添加槽函数声明.QSystemTrayIcon::ActivationReason 是一个枚举类型,表示托盘图标激活的方式.

#include <QWidget>#include <QSystemTrayIcon>class main_win : public QWidget{    Q_OBJECTpublic:    main_win (QWidget *parent = 0);    ~main_win ();private:    QSystemTrayIcon *m_tray_icon;private slots:    void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);};

4.修改main_win.cpp.添加槽函数实现,并鱼托盘图标对象链接.

#include "main_win .h"main_win ::main_win (QWidget *parent)    : QWidget(parent){    QIcon icon = QIcon(":/icons/tray_icon/images/ico_32X32.ico");    setWindowIcon(icon);    this->m_tray_icon = new QSystemTrayIcon(this);    m_tray_icon->setIcon(icon);    m_tray_icon->setToolTip(trUtf8("数据上传程序"));    connect(m_tray_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this, SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason) ) );    m_tray_icon->show();}main_win ::~main_win (){}void main_win ::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason){    switch (reason) {    case QSystemTrayIcon::Trigger:        // click        break;    case QSystemTrayIcon::DoubleClick:        this->show();        break;    default:        break;    }}

此时,启动程序,双击托盘图标,主界面就可以显示出来.


如果希望对托盘图标添加更多的交互,可以给托盘对象添加快捷菜单的方式.

第三步:添加托盘菜单
1.菜单功能需要用到QAction和QMenu类.给托盘添加两个菜单项,显示主界面和退出,修改main_win.h,添加代码如下:

#include <QWidget>#include <QSystemTrayIcon>#include <QAction>#include <QMenu>class main_win : public QWidget{    Q_OBJECTpublic:    main_win (QWidget *parent = 0);    ~main_win ();private:    QSystemTrayIcon *m_tray_icon;    QMenu *m_tray_menu;    QAction *m_action_quit;    QAction *m_action_open;public:    void createActions();    void createMenus();private slots:    void on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason);    void on_quit_app();    void on_show_main_win();};

4.修改main_win.cpp文件,添加对应的实现.

#include "main_win.h"main_win::main_win(QWidget *parent)    : QWidget(parent){    QIcon icon = QIcon(":/icons/tray_icon/images/ico_32X32.ico");    setWindowIcon(icon);    this->m_tray_icon = new QSystemTrayIcon(this);    m_tray_icon->setIcon(icon);    m_tray_icon->setToolTip(trUtf8("数据上传程序"));    // trar icon menu    createActions();    createMenus();    connect(m_tray_icon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this, SLOT(on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason) ) );    m_tray_icon->show();}main_win::~main_win(){}void main_win::on_activatedSysTrayIcon(QSystemTrayIcon::ActivationReason reason){    switch (reason) {    case QSystemTrayIcon::Trigger:        // click        break;    case QSystemTrayIcon::DoubleClick:        this->show();        break;    default:        break;    }}void main_win::on_quit_app(){    exit(0);}void main_win::createActions(){    m_action_quit = new QAction(trUtf8("退出"),this);    connect(m_action_quit, SIGNAL(triggered()), this, SLOT(on_quit_app()));    m_action_open = new QAction(trUtf8("显示主界面"), this);    connect(m_action_open, SIGNAL(triggered()),this, SLOT(on_show_main_win()));}void main_win::createMenus(){    m_tray_menu = new QMenu(this);    m_tray_menu->addAction(m_action_open);    m_tray_menu->addSeparator();    m_tray_menu->addAction(m_action_quit);    m_tray_icon->setContextMenu(m_tray_menu);}void main_win::on_show_main_win(){    this->show();}

此时,启动程序,右键托盘图标,会出现对应的菜单操作.

0 0