基于Qt5开发的一个小巧精美的本地音乐播放器
一、概述
1.1 主要内容:
利用 Qt5 GUI 框架及其中的音频播放模块,完成了一个小巧、界面精美的本地音乐播放器。支持添加本地音乐、添加歌单、歌词查看、自定义背景、系统托盘控制播放等。同时,使用 SQLite 本地数据库保存已添加的音乐、歌单的信息,且使用.ini 文件记录应用设置信息。
1.2 已实现的目标:
- 界面精美且支持自定义背景
- 支持播放的音乐格式:.mp3 文件、.flac 文件、.mpga 文件
- 支持解析并展示歌词文件(.lrc 文件)
- 支持解析歌曲信息(专辑、比特率、缩略图等等)
- 支持歌单管理
- 系统托盘可控制播放
- 数据库保存已添加的歌曲和歌单信息
二、主要类的设计
2.1 依次介绍各个主要类的设计:
Music 类
代表一首歌曲。记录着歌曲相关信息,其中最为重要的是歌曲的 url 信息(即:歌曲文件所在的路径),播放的时候需要根据 url 来将歌曲文件加入播放器。还记录下的一些其他的歌曲信息,可见于下图。


MusicList 类
MusicList 类将 Music 类组织为一个一维结构,便于管理。它表示的是一个歌单,里面包着对歌曲列表进行管理的相关方法。



MusicListWidget 类
以列表形式展示歌曲时,会用到 Qt 中的 QListWidget 组件,而直接使用 QListWidget 组件因为没有结合 MusicList 这个数据结构,所以不太方便管理。因此,MusicListWidget 继承了 QListWidget,它在类中包含 MusicList 类,这样可以将 MusicList 中的歌曲信息方便地可视化展示出来,并且可以方便地对展示出来的歌曲进行管理。
部分数据成员及成员函数展示:

MusicListDialog类
继承于 QDialog 类,在添加歌曲到"我喜欢"和歌单时,用于选择歌曲。这里使用自定义对话框主要为了:① 便于独立使用一个.ui 文件进行界面设计;② 便于获取歌曲数据(即本地音乐有哪些歌曲),以及返回选择结果。
部分数据成员及成员函数展示:

LyricWidget类
继承 QWidget,一个矩形区域,包含有用于显示歌词的几个文本框(QLabel),用于显示歌词。这里使用自定义的 Widget,也是便于独立使用一个.ui 文件进行界面设计。同时这样做,而不是在主窗口中直接显示歌词的文本框。也使得主窗口组件模块化,更加有条理。
此类的主要功能就是解析歌词文件,且按播放进度显示。
部分数据成员及成员函数展示:

MainWidget类
主窗口,用户直接交互的一个窗口组件。负责初始化、处理播放器相关事件、响应用户交互事件(点击、拖动等)等等工作。主要使用.ui 文件在 Qt 设计师中完成界面设计。
部分数据成员及成员函数展示:




2.2 综上所述,各个类之间的关系大致如下图所示:

三、程序的功能特点和运行操作方法
<关于可执行程序的一些说明>
可执行程序为单个.exe 文件。使用"Desktop Qt 5.9.8 MinGW 32bit"构建套件在 Release 模式下生成,然后使用 Enigma Virtual Box 软件将动态 DLL 库文件及其他相关文件打包生成了单个的一个.exe 文件。
第一次运行后,会在同目录下产生两个文件:a)Music.db 文件。SQLite 本地数据库文件,存储已添加到播放器的歌曲的信息;b)LightMusicPlayer.ini 文件。保存用户设置信息,即如果设置了自定义背景图片,会在此配置文件中记录下图片文件的路径。
双击运行即可打开。打开后,可通过点击左上角的图标或者右上方的"关于"按钮,弹出本软件的"关于"信息,其中包含一些说明和操作方法。

点击右下方绿色的按钮(或者使用快捷键"Ctrl+O"),可添加本地音乐。在弹出的窗口中,进入存放音乐文件的目录下,按下"Ctrl+A"全选,再点击打开即可完成添加(此过程中会自动过滤掉不支持播放的文件类型,所以此时用户不用手动筛选添加文件的类型)。

添加本地音乐操作,也可以直接拖拽文件至主窗口界面来完成,也会自动筛选文件类型。

从上图也可看出,播放器主窗口有四个的圆角(值为 10px),界面更加和谐。
添加后,本地音乐列表显示已添加的歌曲。上方的按钮分别表示:清空、整理歌曲(排序且去除重复)、按歌手排序、按歌曲名排序、按时长排序。

此时,双击某首歌曲,即可添加到当前播放,并且开始播放。下方会显示歌曲信息及歌曲图片。同时,当前播放列表中正在播放的歌曲的图标会有所不同。

点击下方的歌词按钮,可进入歌词显示界面。

在本地音乐和当前播放列表中,右键点击某歌曲,可以弹出右键菜单。

点击我喜欢左侧的加号,可批量从"本地音乐"中添加歌曲。弹出如下的对话框。

添加完成后,如下。(同样也支持右键菜单)

点击加号,新建歌单。同时,右键可删除歌单。


双击歌单名字即可进入对应的歌单详情列表。其中的操作与"我喜欢"列表类似。

右上角按钮,可更换背景图片、最小化,以及关闭主窗口。

主窗口关闭后,并不会退出播放器,而是最小化到了系统托盘。系统托盘实时显示正在播放的歌曲,且可通过右键菜单控制播放。


四、实现中值得一提的地方
4.1 歌曲图片
平时从 QQ 音乐等播放器上下载的 MP3 歌曲文件,在 Windows 资源管理器中查看的时候,会有图片显示(专辑图)。所以一开始猜想,歌曲的图片信息也是存储在 MP3 文件中,那 Qt 的库函数可以解析出来吗?最终,查阅手册和根据这个 找到了方法。只需要在解析歌曲文件时候,获取名为" ThumbnailImage"(缩略图)的元数据即可。

4.2 歌词展示
这里使用了 Qt 中的正则表达式来解析标准的 LRC 歌词文件,主要是需要识别出歌词的时间点,如下图。

然后在播放的时候,根据播放进度,比较时间点的先后,在对应的 QLabel 上展示出相应位置的歌词。
4.3 在 Qt Designer 中使用自定义的部件
主窗口的界面设计主要使用.ui 文件完成,而主窗口中的部分组件使用的是自定义的部件(比如 MusicListWidget 和 LyricWidget),但是 Qt Designer 左侧可拖拽出的部件都是Qt 中的自带部件,那么如何使用自定义部件在 Qt Designer 中完成设计呢?
这里可以使用"部件提升"功能,在右侧的"对象与类"窗口,右键,选择"提升为",即可将某个 Qt 中的标准部件,修改为使用自定义的部件(该部件必须继承自对应的标准部件)。
4.4 界面设计总结
- 字体使用"微软雅黑"的粗体比较美观;
- 方框背景设定为白色,且设置一定的透明度;
- 善用.ui 文件同时结合 QSS 样式表进行设计,方便控制间距、位置等;
- 图标的选择、颜色的使用、摆放位置等,注意是否和谐;
- 图标的挑选可使用阿里巴巴矢量图标库