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

对于类似于后台服务的界面非常简单的程序,不需要总显示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_OBJECT

public:
    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_OBJECT

public:
    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_OBJECT

public:
    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();
}

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值