代码仓库:MusicPlayer
v1.0版视频展示:Qt -音乐播放器(仿网易云)V1.0
前言
本文的目标:
一是设置任务栏的图标,
二是设置托盘图标,并支持:
左键点击托盘图标,程序移到屏幕最上面并获得焦点,
右键点击托盘图标,弹出菜单,点击"退出"选项,执行自定义的退出逻辑。
设置任务栏图标
直接在main函数里,调用 QApplication
的 setWindowIcon
就行:
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语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!