QT 系统托盘图标

在软件开发中,有时候需要在托盘显示软件的图标,表示这个软件正在运行,同时点击最小化和关闭按钮时把它缩小到拖盘处,本文介绍Qt实现系统托盘功能,并且最小化,关闭按钮触发隐藏到系统托盘处。下面是具体代码实现:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QSystemTrayIcon>
#include <QCloseEvent>
#include <QEvent>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void initView();
    void initData();
    void initTray();

protected:
    void closeEvent(QCloseEvent *event) override;
    void changeEvent(QEvent *event) override;

public slots:
    void slotOpenWindow();
    void slotQuitWindow();

private:
    Ui::MainWindow *ui;
    QMenu *trayMenu{nullptr};//托盘菜单
    QSystemTrayIcon *m_tray{nullptr};//托盘
    QAction *m_openAction{nullptr};
    QAction *m_quitAction{nullptr};
};
#endif // MAINWINDOW_H

 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTimer>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initView();
    initData();
    initTray();
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::initView()
{


}


void MainWindow::initData()
{

}


void MainWindow::initTray()
{
    if ( m_tray != nullptr ) {
        m_tray->show();
        return;
    }
    m_tray = new QSystemTrayIcon( this );

    connect(m_tray, &QSystemTrayIcon::activated, this,
             [&]( QSystemTrayIcon::ActivationReason reason )
    {
        switch ( reason )
        {
            case QSystemTrayIcon::Trigger:
                //单击托盘图标
                this->slotOpenWindow();
                break;
           case QSystemTrayIcon::DoubleClick:
               //双击托盘图标
               //this->slotOpenWindow();
               break;
            case QSystemTrayIcon::Context:
                //右键图标
                break;
            default:
                break;
        }
    } );

    m_tray->setIcon(QIcon(":/image/icon2.png")); //设定托盘图标
    m_tray->setToolTip(QStringLiteral("托盘提示语")); //提示文字

    m_tray->show(); //让托盘图标显示在系统托盘上

    m_openAction = new QAction( QStringLiteral( "打开" ), this );
    connect(m_openAction, SIGNAL(triggered()), this, SLOT(slotOpenWindow()));


    m_quitAction = new QAction( QStringLiteral( "退出" ), this );
    connect(m_quitAction, SIGNAL(triggered()), this, SLOT(slotQuitWindow()));

    trayMenu = new QMenu( this );
    trayMenu->addAction( m_openAction );
    trayMenu->addSeparator();
    trayMenu->addAction( m_quitAction );
    m_tray->setContextMenu( trayMenu );
}

void MainWindow::closeEvent(QCloseEvent *event)
{
    event->ignore();
    this->hide();
}

void MainWindow::changeEvent(QEvent *event)
{
    qDebug() << "changeEvent================event->type=====" << event->type();
    if((event->type()==QEvent::WindowStateChange) && this->isMinimized())
    {
        QTimer::singleShot(100, this, SLOT(close()));
    }
}

void MainWindow::slotOpenWindow()
{
    this->showNormal();
    this->activateWindow();
}

void MainWindow::slotQuitWindow()
{
    //清理工作
    qApp->quit();
}


QQ图标是托盘图标

   

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值