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

发布于:2025-05-28 ⋅ 阅读:(37) ⋅ 点赞:(0)

博客主页:【夜泉_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::Unknown 0 原因未知
QSystemTrayIcon::Context 1 右键菜单请求
QSystemTrayIcon::DoubleClick 2 双击图标(macOS 需无菜单才触发)
QSystemTrayIcon::Trigger 3 左键点击
QSystemTrayIcon::MiddleClick 4 中键点击

即: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语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!


网站公告

今日签到

点亮在社区的每一天
去签到