项目日记 -Qt音乐播放器 -设置任务栏图标与托盘图标

news2025/7/23 16:40:43

博客主页:【夜泉_ly】
本文专栏:【Qt音乐播放器】
欢迎点赞👍收藏⭐关注❤️

在这里插入图片描述

代码仓库:MusicPlayer
v1.0版视频展示:Qt -音乐播放器(仿网易云)V1.0

前言

本文的目标:
一是设置任务栏的图标,
二是设置托盘图标,并支持:
左键点击托盘图标,程序移到屏幕最上面并获得焦点,
右键点击托盘图标,弹出菜单,点击"退出"选项,执行自定义的退出逻辑。

设置任务栏图标

直接在main函数里,调用 QApplicationsetWindowIcon 就行:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
	a.setWindowIcon(QIcon(":/image/ui/windowIcon.png"));
	// ...
    return a.exec();
}

设置前:在这里插入图片描述
设置后:在这里插入图片描述
哦,图片资源可以在阿里巴巴矢量图标库里面找。

设置托盘图标

在这里插入图片描述
退出程序的按钮,最显而易见的就是右上角那个 “X”。
我把它命名为 pushButton_closeWindow

但是根据生活经验,很多软件,比如微信、QQ等,
你按了右上角的退出按钮,程序只是隐藏了,没有退出。

真正的退出在哪儿?在右下角的托盘:
在这里插入图片描述
如何设置托盘图标?
很简单,1.创建QSystemTrayIcon,2.setIcon,3.show,图标就有了。

void MusicPlayer::initTray()
{
    _tray = new QSystemTrayIcon(this);
    _tray->setIcon(QIcon(":/image/ui/windowIcon.png"));
    _tray->show();

效果:
在这里插入图片描述
嗯,左边是我的,右边是网易云的。

但还没完!现在只设置了图标,你点击它不会有任何的反应!
所以,我们可以给这个图标设置菜单。
设置了菜单, 点击右键自动弹出:

    QMenu* menu = new QMenu(this);
    menu->addAction("退出", this, &MusicPlayer::exit);
    _tray->setContextMenu(menu); // 设置了菜单, 点击右键自动弹出
    // TODO: 菜单改成自定义弹窗

效果:
在这里插入图片描述
丑吗,也许有点,但代码短啊🤣。

但还不够,目前只有右键点击有反应,左键呢?
所有我们可以捕获一下图标的点击事件:

    connect(_tray, &QSystemTrayIcon::activated, this,
    	[=](QSystemTrayIcon::ActivationReason reason) {

ActivationReason 是个枚举,返回值的可能性有五种:

常量描述
QSystemTrayIcon::Unknown0原因未知
QSystemTrayIcon::Context1右键菜单请求
QSystemTrayIcon::DoubleClick2双击图标(macOS 需无菜单才触发)
QSystemTrayIcon::Trigger3左键点击
QSystemTrayIcon::MiddleClick4中键点击

即:0 - 未知,1 - 右键,2 - 双击,3 - 左键,4 - 中键

我们这里只关心左键:

        if (reason == QSystemTrayIcon::Trigger) {
            this->showNormal(); // 变为正常大小,与之对应的是showMinimized
            raise(), activateWindow(); // 放到最上面+变成活动窗口
        }
    });

其他

自定义退出函数

这个项目,目前是在退出程序的时候保存数据到数据库中,
如果数据多了,保存时间变长,看上去就跟卡了一样。

那怎么解决呢?最简单的办法,那就是别让人看到不就行了😋。

我们在退出函数中,先把主窗口关了,再把托盘图标隐藏了,
然后再进行保存,退出。

这样在用户看来,他们一点退出按钮,程序就不见了,
嗯,看不见了就是已经关掉了。

void MusicPlayer::exit()
{
    // 这里保存速度有点慢,所以先隐藏一下窗口,这样保存再慢也不影响观感
    on_pushButton_closeWindow_clicked(); // 欸嘿
    _tray->hide(); // 欸嘿嘿
    SongManager::instance()->storage();
    close();
}

自定义退出按钮的行为

pushButton_closeWindow目前的工作,就只有隐藏了:

void MusicPlayer::on_pushButton_closeWindow_clicked()
{
    hide(); // 隐藏就行,close丢给托盘
}

在这里插入图片描述


希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产 BIM 软件万翼斗拱的技术突破与现实差距 —— 在创新与迭代中寻找破局之路

万翼斗拱在国产BIM领域迈出重要一步,凭借二三维一体化、参数化建模及AI辅助设计等功能形成差异化竞争力,在住宅设计场景中展现效率优势,但与国际主流软件相比,在功能完整性、性能稳定性和生态成熟度上仍有显著差距,需通…

Golang|etcd服务注册与发现 策略模式

etcd 是一个开源的 分布式键值存储系统(Key-Value Store),主要用于配置共享和服务发现。 ETCD是一个键值(KV)数据库,类似于Redis,支持分布式集群。ETCD也可以看作是一个分布式文件系统&#xff…

STM32的OLED显示程序亲测可用:适用于多种场景的稳定显示解决方案

STM32的OLED显示程序亲测可用:适用于多种场景的稳定显示解决方案 【下载地址】STM32的OLED显示程序亲测可用 这是一套专为STM32设计的OLED显示程序,经过实际测试,运行稳定可靠。支持多种OLED屏幕尺寸和类型,提供丰富的显示效果&am…

【AI News | 20250529】每日AI进展

AI Repos 1、WebAgent 阿里巴巴通义实验室近日发布了WebDancer,一款旨在实现自主信息搜索的原生智能体搜索推理模型。WebDancer采用ReAct框架,通过分阶段训练范式,包括浏览数据构建、轨迹采样、监督微调和强化学习,赋予智能体自主…

Day12 - 计算机网络 - HTTP

HTTP常用状态码及含义? 301和302区别? 301:永久性移动,请求的资源已被永久移动到新位置。服务器返回此响应时,会返回新的资源地址。302:临时性性移动,服务器从另外的地址响应资源,但…

Linux驱动学习笔记(十)

热插拔 1.热插拔:就是带电插拔,即允许用户在不关闭系统,不切断电源的情况下拆卸或安装硬盘,板卡等设备。热插拔是内核和用户空间之间,通过调用用户空间程序实现交互来实现的,当内核发生了某种热拔插事件时…

TI dsp FSI (快速串行接口)

简介 快速串行接口(FSI - Fast Serial Interface )模块是一种串行通信外设,能够在隔离设备之间实现可靠的高速通信。在两个没有共同电源和接地连接的电子电路必须交换信息的情况下,电气隔离设备被使用。 虽然隔离设备促进了信号通…

责任链模式:构建灵活可扩展的请求处理体系(Java 实现详解)

一、责任链模式核心概念解析 (一)模式定义与本质 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,其核心思想是将多个处理者对象连成一条链,并沿着这条链传递请求,直到有某…

wechat-003-学习笔记

1.路由跳转页面:携带的参数会出现在onlaod中的options中。 注意:原生小程序对路由传参的长度也有限制,过长会被截掉。 2.wx.setNavigationBarTitle(Object object) 动态设置当前页面的标题 3.在根目录中的app.json文件中配置 后台播放音乐的能…

【大模型微调】魔搭社区GPU进行LLaMA-Factory微调大模型自我认知

文章概要: 本文是一篇详细的技术教程,介绍如何使用魔搭社区(ModelScope)的GPU资源来进行LLaMA-Factory的模型微调。文章分为11个主要步骤,从环境准备到最终的模型测试,系统地介绍了整个微调流程。主要内容包…

【数据结构】哈希表的实现

文章目录 1. 哈希的介绍1.1 直接定址法1.2 哈希冲突1.3 负载因子1.4 哈希函数1.4.1 除法散列法/除留余数法1.4.2 乘法散列法1.4.3 全域散列法 1.5 处理哈希冲突1.5.1 开放地址法1.5.1.1 线性探测1.5.1.2 二次探测1.5.1.3 双重探测1.5.1.4 三种探测方法对比 1.6.3 链地址法 2. 哈…

永磁同步电机控制算法--基于电磁转矩反馈补偿的新型IP调节器

一、基本原理 先给出IP速度控制器还是PI速度控制器的传递函数: PI调节器 IP调节器 从IP速度控制器还是PI速度控制器的传递函数可以看出,系统的抗负载转矩扰动能力相同,因此虽然采用IP速度控制器改善了转速环的超调问题,但仍然需要通过其他途…

RabbitMQ 应用 - SpringBoot

以下介绍的是基于 SpringBoot 的 RabbitMQ 开发介绍 Spring Spring AMQP RabbitMQ RabbitMQ tutorial - "Hello World!" | RabbitMQ 工程搭建步骤: 1.引入依赖 2.编写 yml 配置,配置基本信息 3.编写生产者代码 4.编写消费者代码 定义监听类,使用 RabbitListener…

基于递归思想的系统架构图自动化生成实践

文章目录 一、核心思想解析二、关键技术实现1. 动态布局算法2. 样式规范集成3. MCP服务封装三、典型应用场景四、最佳实践建议五、扩展方向一、核心思想解析 本系统通过递归算法实现了Markdown层级结构到PPTX架构图的自动转换,其核心设计思想包含两个维度: 数据结构递归:将…

OpenGL Chan视频学习-9 Index Buffers inOpenGL

bilibili视频链接: 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站: docs.gl 说明: 1.之后就不再单独整理网站具体函数了,网站直接翻译会…

Nginx安全防护与HTTPS部署实战

目录 前言一. 核心安全配置1. 隐藏版本号2. 限制危险请求方法3. 请求限制(CC攻击防御)(1)使用nginx的limit_req模块限制请求速率(2)压力测试验证 4. 防盗链 二. 高级防护1. 动态黑名单(1&#x…

JAVA重症监护系统源码 ICU重症监护系统源码 智慧医院重症监护系统源码

智慧医院重症监护系统源码 ICU重症监护系统源码 开发语言:JavaVUE ICU护理记录:实现病人数据的自动采集,实时记录监护过程数据。支持主流厂家的监护仪、呼吸机等床旁数字化设备的数据采集。对接检验检查系统,实现自动化录入。喜…

python:机器学习(KNN算法)

本文目录: 一、K-近邻算法思想二、KNN的应用方式( 一)分类流程(二)回归流程 三、API介绍(一)分类预测操作(二)回归预测操作 四、距离度量方法(一)…

【笔记】2025 年 Windows 系统下 abu 量化交易库部署与适配指南

#工作记录 前言 在量化交易的学习探索中,偶然接触到 2017 年开源的 abu 量化交易库,其代码结构和思路对新手理解量化回测、指标分析等基础逻辑有一定参考价值。然而,当尝试在 2025 年的开发环境中部署这个久未更新的项目时,遇到…

小程序 - 视图与逻辑

个人简介 👨‍💻‍个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言: “心有多大,舞台就有多大。” 📚推荐学习: 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒T…