让我们的程序拥有任务栏托盘图标,实现程序后台运行,退出等功能
1、关闭程序保持后台
重写关闭事件,忽略点击窗口关闭
void MainWindow::closeEvent(QCloseEvent *event)
{
// 隐藏窗口,而不是真正关闭
setVisible(false);
// 忽略关闭事件,阻止窗口真正关闭
event->ignore();
}
2、添加任务栏托盘图标
创建一个任务链托盘图标,添加上退出和显示的菜单按钮,定义显示的槽函数
// 创建系统托盘图标对象
QSystemTrayIcon* pSystemTray = new QSystemTrayIcon(&w);
// 判断系统托盘图标是否创建成功
if (NULL != pSystemTray) {
// 设置托盘图标
pSystemTray->setIcon(QIcon(":/res/totle.svg"));
// 设置托盘图标的提示信息
pSystemTray->setToolTip("别坐着了");
// 显示托盘图标
pSystemTray->show();
}
// ---------- 创建托盘菜单 ----------
// 创建托盘菜单对象
auto* trayMenu = new QMenu(&w);
// 创建“显示面板”菜单项
auto* showPanelAction = new QAction("显示面板", &w);
// 连接菜单项的触发信号与主窗口的showPanel槽函数
QObject::connect(showPanelAction,&QAction::triggered,&w,&MainWindow::showPanel);
// 将菜单项添加到托盘菜单中
trayMenu->addAction(showPanelAction);
// 创建“退出”菜单项
auto* quitAction = new QAction("退出",&w);
// 连接菜单项的触发信号与 QApplication 的 quit() 槽函数
QObject::connect(quitAction,&QAction::triggered,&w,&QApplication::quit);
// 将菜单项添加到托盘菜单中
trayMenu->addAction(quitAction);
// 设置托盘图标的上下文菜单
pSystemTray->setContextMenu(trayMenu);
// 显示托盘图标
pSystemTray->show();
完整代码
main。cpp
#include "mainwindow.h"
#include <QApplication>
#include <QSystemTrayIcon>
#include <QMenu>
int main(int argc, char *argv[])
{
// 创建 Qt 应用程序对象
QApplication a(argc, argv);
// 创建主窗口对象
MainWindow w;
// ---------- 设置任务栏托盘图标 ----------
// 创建系统托盘图标对象
QSystemTrayIcon* pSystemTray = new QSystemTrayIcon(&w);
// 判断系统托盘图标是否创建成功
if (NULL != pSystemTray) {
// 设置托盘图标
pSystemTray->setIcon(QIcon(":/res/totle.svg"));
// 设置托盘图标的提示信息
pSystemTray->setToolTip("别坐着了");
// 显示托盘图标
pSystemTray->show();
}
// ---------- 创建托盘菜单 ----------
// 创建托盘菜单对象
auto* trayMenu = new QMenu(&w);
// 创建“显示面板”菜单项
auto* showPanelAction = new QAction("显示面板", &w);
// 连接菜单项的触发信号与主窗口的showPanel槽函数
QObject::connect(showPanelAction,&QAction::triggered,&w,&MainWindow::showPanel);
// 将菜单项添加到托盘菜单中
trayMenu->addAction(showPanelAction);
// 创建“退出”菜单项
auto* quitAction = new QAction("退出",&w);
// 连接菜单项的触发信号与 QApplication 的 quit() 槽函数
QObject::connect(quitAction,&QAction::triggered,&w,&QApplication::quit);
// 将菜单项添加到托盘菜单中
trayMenu->addAction(quitAction);
// 设置托盘图标的上下文菜单
pSystemTray->setContextMenu(trayMenu);
// 显示托盘图标
pSystemTray->show();
// 进入应用程序事件循环
return a.exec();
}
mainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMessageBox>
#include <QMainWindow>
#include <QCloseEvent>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public slots:
void showPanel();
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void closeEvent(QCloseEvent *event);
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::closeEvent(QCloseEvent *event)
{
// 隐藏窗口,而不是真正关闭
setVisible(false);
// 忽略关闭事件,阻止窗口真正关闭
event->ignore();
}
void MainWindow::showPanel()
{
// 显示窗口
this->show();
// 将窗口置顶,确保其显示在最前面
this->raise();(
}
纯真丁一郎的博客:有时间就要学习 |
---|