QT----给程序添加上任务栏托盘图标和退出

让我们的程序拥有任务栏托盘图标,实现程序后台运行,退出等功能

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

纯真丁一郎的博客:有时间就要学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/483927.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【蓝牙协议栈】【BLE】低功耗蓝牙配对绑定过程分析(超详细)

1. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅&#xff0c;【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#xff01…

Java双指针算法

参考&#xff1a; 【Java版本】常用代码模板1——基础算法 模板题参考实现 - AcWing 【Java版本】常用代码模板2——数据结构 模板题参考实现 - AcWing 题目一&#xff1a; 输入&#xff1a;abc def ghi 输出&#xff1a;abc def ghi 题解&#xff1a; public class …

☆【前后缀】【双指针】Leetcode 42. 接雨水

【前后缀】【双指针】Leetcode 42. 接雨水 解法1 前后缀分解解法2 双指针 ---------------&#x1f388;&#x1f388;42. 接雨水 题目链接&#x1f388;&#x1f388;------------------- 解法1 前后缀分解 维护一个前缀&#xff08;左侧最高&#xff09;后缀&#xff08;右侧…

基于python+vue高校门诊管理系统flask-django-php-nodejs

课题主要采用python开发语言、django框架和MySQL数据库开发技术以及基于Eclipse的编辑器。系统主要包括用户、用户充值、医生、挂号信息、检查开药、药品信息、药品入库、取药出库等功能&#xff0c;从而实现智能化的管理方式&#xff0c;提高工作效率。 语言&#xff1a;Pytho…

全流程基于GIS、python机器学习技术的地质灾害风险评价与信息化建库教程

原文链接&#xff1a;全流程基于GIS、python机器学习技术的地质灾害风险评价与信息化建库https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247598798&idx6&sn29597597dc134060576998b3302467f8&chksmfa820329cdf58a3fa73c04ac20a28fab7c7ee8fb15d0f8ac50…

python处理Excel的方法之xlrd

python处理Excel常用到的模块是xlrd。使用xlrd可以非常方便的处理Excel文档&#xff0c;下面介绍一下基本用法 打开文件 import xlrd data xlrd.open_workbook("c:\\skills.xls") 获取一个工作表 table data.sheet_by_name(uskills) #也可以 table data.sheet_by_…

测试CAN功能是否使能成功

一. 简介 上一篇文章学习了在 kernel内核源码如何使能 Linux 内核自带的 FlexCAN 驱动。通过配置kernel来实现。文章如下&#xff1a; 本文验证&#xff0c;开发板加载新生成的 zImage内核镜像文件&#xff0c;确定 CAN驱动是否已经成功使能。 二. 测试CAN驱动是否使能成功…

Go --- 编程知识点及其注意事项

new与make 二者都是用于内存分配&#xff0c;当声明的变量是引用类型时&#xff0c;不能给该变量赋值&#xff0c;因为没有分配空间。 我们可以用new和make对其进行内存分配。 首先说说new new函数定义 func new(Type) *Type传入一个类型&#xff0c;返回一个指向分配好该…

Nacos部署(一)Linux部署Nacos2.3.x单机环境

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Nacos部署&#xff08;一&#xff09;Linux部署Nacos2.3.x单机环境 ⏱️…

鸿蒙开发学习【地图位置服务组件】

简介 移动终端设备已经深入人们日常生活的方方面面&#xff0c;如查看所在城市的天气、新闻轶事、出行打车、旅行导航、运动记录。这些习以为常的活动&#xff0c;都离不开定位用户终端设备的位置。 当用户处于这些丰富的使用场景中时&#xff0c;系统的位置定位能力可以提供…

深度解析:Elasticsearch写入请求处理流程

版本 Elasticsearch 8.x 原文链接&#xff1a;https://mp.weixin.qq.com/s/hZ_ZOLFUoRuWyqp47hqCgQ 今天来看下 Elasticsearch 中的写入流程。 不想看过程可以直接跳转文章末尾查看总结部分。最后附上个人理解的一个图。 从我们发出写入请求&#xff0c;到 Elasticsearch 接收请…

应急响应实战笔记03权限维持篇(7)

第7篇&#xff1a;常见WebShell管理工具 攻击者在入侵网站时&#xff0c;通常要通过各种方式写入Webshell&#xff0c;从而获得服务器的控制权限&#xff0c;比如执行系统命令、读取配置文件、窃取用户数据&#xff0c;篡改网站页面等操作。 本文介绍十款常用的Webshell管理工…

图论基础|深度优先dfs、广度优先bfs

dfs 与 bfs 区别 提到深度优先搜索&#xff08;dfs&#xff09;&#xff0c;就不得不说和广度优先搜索&#xff08;bfs&#xff09;有什么区别 先来了解dfs的过程&#xff0c;很多录友可能对dfs&#xff08;深度优先搜索&#xff09;&#xff0c;bfs&#xff08;广度优先搜索…

K8S之DaemonSet控制器

DaemonSet控制器 概念、原理解读、应用场景概述工作原理典型的应用场景介绍DaemonSet 与 Deployment 的区别 解读资源清单文件实践案例 概念、原理解读、应用场景 概述 DaemonSet控制器能够确保K8S集群所有的节点都分别运行一个相同的pod副本&#xff1b; 当集群中增加node节…

【嵌入式】Docker镜像构建指南:引领应用部署的革新之路

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟。提供嵌入式方向的学习指导、简历面…

绘制韦恩图

主要源于跟着Cell学作图 | 12.韦恩图(Vennerable包)-CSDN博客&#xff0c;增加了相关数据转换的处理。 韦恩图与upset差异 upset图&#xff1a;多个集合交集可视_upset图r语言代码自定义交集顺序-CSDN博客 rm(list ls()) #构建模型数据 group1 <- rep(c("1",…

AcWing 796. 子矩阵的和

这个题的重点是仿照一维的数组&#xff0c;所以a[N][N]也是从1索引开始的。画个图举个例子就非常清晰了 之所以不好理解是因为没画格子&#xff0c;一个格子代表一个点&#xff0c;就很好理解了。 java代码&#xff1a; import java.io.*; public class Main{static int N 1…

Java为什么是值传递?

Java为什么是值传递&#xff1f; 在我们调用方法的时候&#xff0c;通常会传递参数&#xff0c;那我们到底传递的是对象本身&#xff0c;还是仅仅是对象的拷贝对象呢&#xff1f; 先搞懂两个概念&#xff0c;形参和实参 形参和实参 实参&#xff08;实际参数&#xff0c;Ar…

【热门话题】ECMAScript vs JavaScript:理解两者间的联系与区别

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 ECMAScript vs JavaScript&#xff1a;理解两者间的联系与区别1. ECMAScript&am…

Java设计模式之单例模式(多种实现方式)

虽然写了很多年代码&#xff0c;但是说真的对设计模式不是很熟练&#xff0c;虽然平时也会用到一些&#xff0c;但是都没有深入研究过&#xff0c;所以趁现在有空练下手 这章主要讲单例模式&#xff0c;也是最简单的一种模式&#xff0c;但是因为spring中bean的广泛应用&#…