Qt系统托盘程序的实现

Qt系统托盘程序的创建

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

直接上代码
Qt系统托盘程序的实现_第1张图片
sysTrayIconWidget.h

#ifndef SYSTRAYICONWIDGET_H
#define SYSTRAYICONWIDGET_H

#include 
#include 
#include 
#include 
#include 

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 

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.pngQt系统托盘程序的实现_第2张图片

在这里插入图片描述

你可能感兴趣的:(Qt,技巧,c++,qt,ui,开发语言)