基于Qt5(C++)+SQLite 开发的一个小巧精美的本地音乐播放器

基于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 样式表进行设计,方便控制间距、位置等;
  • 图标的选择、颜色的使用、摆放位置等,注意是否和谐;
  • 图标的挑选可使用阿里巴巴矢量图标库
相关推荐
扶尔魔ocy2 小时前
【QT window】ffmpeg实现录音功能之AAC格式--mp4
qt·ffmpeg·视频处理
差点GDP2 小时前
C语言常用编译命令和示例
c语言·开发语言
cheniie2 小时前
Windows下c/c++使用pgsql
c++·windows·postgresql
weixin_307779132 小时前
Jenkins Pipeline: Input Step插件详解与实践指南
运维·开发语言·自动化·jenkins·etl
SunkingYang2 小时前
QT设计师里的Text Edit、Plain Text Edit、Text Browser分别用什么作用,又有什么区别
qt·区别·qt设计师·功能·text edit·plain text edit·text browser
宵时待雨2 小时前
C语言笔记归纳21:编译与链接
linux·c语言·开发语言·笔记
天勤量化大唯粉2 小时前
基于距离的配对交易策略:捕捉价差异常偏离的均值回归机会(天勤量化代码实现)
android·开发语言·python·算法·kotlin·开源软件·策略模式
Q741_1472 小时前
Linux 进程核心解析 fork()详解 多进程的创建与回收 C++
linux·c++·面试·笔试·进程
白昼流星!2 小时前
C++ 封装的经典实践:从立方体到点圆关系的面向对象思考
c++