此为QT编程的第二十四谈!关注我,带你快速学习QT编程的学习路线!
每一篇的技术点都是很很重要!很重要!很重要!但不冗余!
我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点!
码农不易,各位学者学到东西请点赞支持支持!
开始部分:
总:调用API在开发中是常用的,但API的时效是有限的。有时候更新就会失效。此次用的是网易云的API来获取音乐数据。
分:
1.老规矩,创建一个QMainWindow项目

2.在.ui文件中布局好你想要的播放器界面,并命名和样式,按钮转到槽函数,进度条转到槽函数,下面是预设图:


3.在.pro文件添加两个模块,multimedia模块、network模块

4.在.h文件添加相关开发模块,实现背景模块、通过json网络接收模块、播放器模块

5.这五个是转到槽函数,根据自己的ui界面来设计

6.重写绘画事件,用于实现背景功能

7.自定义成员变量和槽函数,用于实现播放进度条、音量进度条、搜索获取API音乐数据信息等

8.此刻,架构已经完成!开始实现功能!先实现最基础的背景功能

9.实现最重要的搜索功能,从API中申请获取音乐数据
9.1 str1用于存放搜索的歌曲名字作为API的参数
9.2 str2是API,添加str1参数
9.3 将API设置给networkRequest
9.4 再使用NetworkAccessManager来发送get请求并获取响应数据

10.实现最重要的接收数据功能,使用json反序列化接收数据,并在构造函数连接信号与槽
10.1 networkAccessManager通过get获取到的数据,通过networkReply的readAll函数来读取
10.2 将缓存区的数据添加到json文档里面
10.3 再将json文档转变为json对象
10.4 存储所有key到stringlist数据结构中,然后判断是否有"result"键
10.5 再将result部分转换为json对象
10.6 再次进行存储所有的key到stringlist数据结构中,判断有没有"songs"键
10.6 再将songs部分转换为json数组
10.7 再用for循环遍历数组信息,来获取歌曲ID、歌名、歌手等等
10.8 获取了歌曲ID后可通过音乐数据api来直接访问获取歌曲音频
//处理搜索数据信息返回函数
void MainWindow::HandleDataBackFunc(QNetworkReply *pReply)
{
//读取网络回馈数据
QByteArySearchInfo=pReply->readAll();
QJsonParseError JsonError;
//将json文本转换为json文件对象
QJsonDocument jsonDoc_RecvData=QJsonDocument::fromJson(QByteArySearchInfo,&JsonError);
if(JsonError.error!=QJsonParseError::NoError)
{
QMessageBox::information(this,"出错","json格式错误");
return;
}
//QJsonObject使用函数object()
QJsonObject TotalJsonObject=jsonDoc_RecvData.object();
//列出json里面所以的key
QStringList strKeys=TotalJsonObject.keys();
if(strKeys.contains("result"))
{
//将带有result的数据内容提取之后转换为对象
QJsonObject resultobject=TotalJsonObject["result"].toObject();
//存储所有keys
QStringList strResultKeys=resultobject.keys();
//如果keys是songs,证明搜索到对应的歌曲
if(strResultKeys.contains("songs"))
{
QJsonArray array=resultobject["songs"].toArray();
for(auto song:array)
{
QJsonObject jsonobject1=song.toObject();
//获取歌曲ID 歌名 歌手
Music_ID=jsonobject1["id"].toInt();
StrMusicName=jsonobject1["name"].toString();
QStringList strkeys=jsonobject1.keys();
if(strkeys.contains("artists"))
{
QJsonArray artistsjsonarray=jsonobject1["artists"].toArray();
for(auto js:artistsjsonarray)
{
QJsonObject jsonobject2=js.toObject();
StrSingerName=jsonobject2["name"].toString();
}
}
}
}
QString strUrl;
strUrl=QString("https://music.163.com/song/media/outer/url?id=%0").arg(Music_ID);
p_PlayerList->clear();
p_PlayerList->addMedia(QUrl(strUrl));
ui->lineEdit_SongShow->setText(StrMusicName+"--"+StrSingerName);
}
}
结合JSON的例子:
{
"resultCode": 200,
"resultMsg": "查询成功",
"data": {
"songCount": 1,
"songs": [
{
"id": 12345678,
"name": "成都",
"artists": [
{
"id": 9876543,
"name": "赵雷"
}
],
"album": {
"id": 87654321,
"name": "无法长大",
"picUrl": "http://example.com/album_cover.jpg"
},
"duration": 210000, // 歌曲时长,单位毫秒
"aliases": ["Chengdu"],
"status": 0,
"copyrightId": 12345678,
"publishTime": 1489104000000,
"size": 5,
"mvid": 0,
"fee": 8,
"popularity": 100,
"score": 10000,
"crbt": null,
"audition": null,
"copywriter": "",
"rtUrl": null,
"rtype": 0,
"rurl": null,
"mv": 0,
"mp3Url": "http://example.com/song.mp3",
"hMusicUrl": "http://example.com/high_quality.mp3",
"lMusicUrl": "http://example.com/low_quality.mp3",
"rtUrls": [],
"djFlag": 0,
"sPicUrl": "http://example.com/small_cover.jpg",
"bMusicUrl": "http://example.com/background.mp3",
"annotations": []
}
]
}
}
11.接受完数据就可以进行实现播放功能了,但此时未实现跟进度条控件的结合,通过一个状态量来区分播放状态还是暂停状态

12.完成歌曲进度条的设置最大值跟音乐的时长相匹配,在构造函数添加信号与槽。当切换歌曲的时候,就设置新歌曲最大值匹配
![]()

13.完成歌曲进度条随歌曲进度移动的槽函数,并实现用户拖拉歌曲进度条值槽函数,并在构造函数连接信号与槽,每当歌曲在播放的时候,都会自行移动进度条跟上音乐进度,还有用户移动进度条的时候,也会触发槽函数,实现歌曲的进度变化和进度条的位置变化



14.此时已经完成大部分的操作了,最后实现音量进度条
15.再在构造函数初始化一些初始状态即可

16.实现效果图如下:

未播放状态:

播放状态:



2341

被折叠的 条评论
为什么被折叠?



