# QtMusicPlayer
**Repository Path**: Singtren/qt-music-player
## Basic Information
- **Project Name**: QtMusicPlayer
- **Description**: C++ QT写的音乐播放器
- **Primary Language**: C++
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 11
- **Forks**: 3
- **Created**: 2021-10-26
- **Last Updated**: 2025-01-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# QT音乐播放器
## 简介
这是一款使用C++ QT编写的在线音乐播放器,可以运行在Windows/Linux/Mac平台上。音乐播放器使用网易云API(非官方API)实现歌曲在线搜索和网易云音乐登录。登录网易云账号后可播放自己歌单中的歌曲。
项目中使用的网易云音乐API为 [Binaryify/NeteaseCloudMusicApi](https://binaryify.github.io/NeteaseCloudMusicApi)。使用该API需要自行搭建后端服务器,可参考[NeteaseCloudMusicApi](https://github.com/Binaryify/NeteaseCloudMusicApi) 或者使用在线服务器https://163.lpddr5.cn/
项目使用的QT版本为QT 5.14
音乐播放器界面:


## 主要功能
- #### 无边框窗口
主界面使用无边框窗口,实现了窗口的拖拽和拉伸。
- #### 音乐播放器的基本功能,播放,暂停,音量调节,上/下一曲,切换播放模式(单曲循环,列表循环等)
- #### 本地音乐播放
可以添加本地音乐到歌单并播放
- #### 在线音乐搜索
通过关键词可搜索歌曲,关键词会匹配音乐标题,歌手,和专辑名。双击歌曲可以播放搜索到的歌曲。搜索功能使用了网易云音乐的接口,可以不登录账号使用。
- #### 歌词显示,歌词随歌曲进度同步滚动
播放歌曲时,如果歌曲是在线歌曲,播放器会通过网易云音乐API请求歌词并解析歌词文件。点击歌词按钮可以显示歌曲的歌词,歌词会随歌曲的进度同步滚动。
- #### 网易云音乐账号登录
通过手机号和密码可以登录网易云音乐账号。登录账号后可显示自己的歌单并播放歌单中的歌曲,在左侧列表点击对应歌单后能显示歌单中的歌曲列表.
- #### 播放列表窗口
点击播放列表按就可以打开播放列表,可以在播放列表中切换歌曲,删除歌曲,添加本地歌曲到播放列表。
## 代码结构和接口说明
#### 主界面MainWidget类
mainwidget.cpp,mainwidget,mainwidget.ui
主窗口`MainWidegt`类继承自`QWidet` ,用于创建音乐播放器主窗口,显示界面元素,响应用户操作,控制歌曲播放,通过信号与槽机制向其它对象发送消息,接收其他对象的信号并处理。
#### 自定义窗口基类SubWindow
文件: subwindow.cpp,subwindow.h
继承自`QWidget`, 无边框(FramelessWindowHint),带有关闭按钮,支持鼠标拖拽移动的窗口
#### 登录窗口Login
login.cpp,login.h,login.ui
继承自`SubWindow`, 用于创建登录窗口,向主窗口发送登录和注销的信号。
登录界面:
#### 播放列表窗口MusicList
musiclist.cpp,musiclist.h,musiclist.ui
播放窗口类,继承自`SubWindow`, 用于创建播放列表窗口。
#### 歌曲信息Song,SongList类
Song.h
`Song`类定义了一首歌曲的基本信息,如歌名`songName`, 歌手名`artistName`,
歌曲在网络或本地的地址`url`等。
`SongList`类继承自`QList`
**接口:**
`void wirteToTable(QTableWidget *tb);` 用SongList中的歌曲信息替换表格tb的内容
`void appendToTable(QTableWidget *tb);`将SongList里的歌曲添加到表格tb尾部。
#### 网络请求 Network类
network.cpp, network.h
处理登录,注销,歌曲搜索,歌曲url获取等网络请求
**接口:**
`void search(QString keywords, int limit = 30, int offset = 0);`
以keywords为关键字搜索歌曲,limit指定查询结果中每页最大歌曲数量,offset指定返回第几页查询结果
`void getSongUrl(Song song);`通过song获取歌曲的URL地址
`void getLyric(unsigned id);`通过歌曲id获取歌词
`void getPlayListById(unsigned id);`通过歌单id获取该用户歌单中的所有歌曲
`void logout();`注销当前登录的用户
以上网络请求会以发送信号的方式返回结果。
比如search请求得到响应报文并解析完毕后会发出`void searchDone(SongList) `信号告诉调用者搜索结果
#### 播放列表PlayList类
playlist.h,playlist.cpp
继承自`QMediaPlaylist`,维护音乐播放器的当且播放列表
**接口:**
`void append(Song song);`向播放列表添加歌曲song
`void appendAndPlay(Song song); `添加歌曲并播放
`void appendSongList(const SongList &list);`添加一个SongList
` void deleteByIndex(int n); `删除列表中第n+1首歌曲
` void clearList(); `清空播放列表
`void loadList(const SongList &list);`情况当且列表并从list加载播放列表
` void saveInFile(QString path);`将播放列表保存到path指定的本地文件
#### 歌词显示LyricDisplay类
lyricdisplay.cpp,lyricdisplay.h
继承自`QScrollArea`,用于显示歌词
**接口:**
`bool setLyric(const QString &rawLyric)`使用未解析的歌词字符串`rawLyric`作为当且歌曲的歌词。LyricDisplay会根据歌曲的进度同步滚动歌词。
`public slot:`
`void setPosition(int time)` 使用该函数通知LyricDisplay当且歌曲的进度,time的单位为毫秒。
#### SongTable
songtable.cpp,songtable.h
继承自`QTableWidget`,用于歌曲列表的显示。设置了表格的样式,音乐播放器中显示的所有歌曲列表都是`SongTable`类。
#### 主函数
main.cpp
创建`MainWidget`窗口并进入消息循环。
#### 图标和qss资源
/pic文件夹下存放了音乐播放器用到的图片资源
styleSheet.qss为qt样式表文件