带你0到1之QT编程:二十四、从零打造你的音乐播放器,尽享API调用的魅力

此为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.实现效果图如下:

未播放状态:

播放状态:

总:总体来说,API的调用并不难,根据官方API的文档来进行添加参数调用即可,然后通过网络模块进行json的反序列化获取的数据,并展示在app上即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值