在软件开发中,有时候需要在托盘显示软件的图标,表示这个软件正在运行,同时点击最小化和关闭按钮时把它缩小到拖盘处,本文介绍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图标是托盘图标