《二》MP3在线搜索所歌曲的实现

上一期我们大致实现了布局等操作

那么这一期我们来实现如何去搜索歌曲:

首先呢,我们是设计多媒体,要包含多媒体类头文件,还要能在线搜索,那就要包含网络上的头文件,还要实现打开文件操作,处理文本块,计时器等操作,我们要加上头文件。

不过再加上头文件之前,要在Pro文件加上:

QT      +=network
QT      +=multimedia

不然会报错,实现不了

//进行网络访问,获取响应,处理错误等操作
#include<QNetworkAccessManager>
//是上一个发送请求之后,返回的响应类
#include<QNetworkReply>#include<QMediaPlayer>//添加多媒体播放器的类
#include<QMediaPlaylist>//添加多媒体播放器列表的类
#include<QTextBlock>
#include<QTimer>
#include<QFileDialog>
#include<QJsonParseError>//解析json数据时错误处理类
#include<QJsonObject>//该类用于操作json数组的类
#include<QLCDNumber>

有了头文件之后,我们就应该自定义一些成员变量:

public://自定义成员QMediaPlayer *P_PlayerObject;//播放器操作对象QMediaPlaylist *P_Playerlist;//定义播放器 列表QByteArray QByteArySearchInfo;//存储搜索信息QString StrLocalMusicPath;//导入本地音乐路径//歌曲idint Music_ID;int ipos;//标记//歌曲名称,歌手QString StrMusicName,StrSingerName;QTextDocument *docTextObject;//处理富文本内容QTextBlock *qTextLine;//处理文本块指针QNetworkAccessManager *NetworkAccessManagers;//网络访问

这个标记可以用来标记歌曲的状态等信息,我们先定义着,不够用再接着写,

既然成员变量有了,那我们还缺一些槽函数去处理这些,主要包括进度条的变化,时间的变化,既然是在线 搜索,还要处理返回的数据。

    //自定义槽函数
public slots://处理数据信息返回void HandleDataBackFun(QNetworkReply *pReply);//处理lcdnumber时间的变化void HandleLCDNumberTimeChangeFunc(qint64 duration);//处理进度条控件变化void HandleProgressTimeChangeFunc(qint64 dration);//播放进度位置变化void HandlePositionChangeFunc(qint64 position);//处理播放歌曲void HandlePlaySongFunc();

把这些个槽函数放到cpp文件之后,得去实例化那些个成员变量和槽函数的链接:

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);//去掉窗口标题栏this->setWindowFlags(Qt::FramelessWindowHint);//禁止改变窗口大小this->setFixedSize(this->width(),this->height());//播放进度条控件美化//将光标定位到搜索歌曲名称当中ui->lineEdit_inputMusic->setFocus();//初始化一个实例NetworkAccessManagers=new QNetworkAccessManager(this);ipos=0;docTextObject=ui->plainTextEdit_MusicList->document();//设置为只读ui->plainTextEdit_MusicList->setReadOnly(true);//初始化多媒体实例P_Playerlist=new QMediaPlaylist(this);P_PlayerObject=new QMediaPlayer(this);P_PlayerObject->setMedia(P_Playerlist);//设置播放列表//设置播放模式--循环P_Playerlist->setPlaybackMode(QMediaPlaylist::Loop);//信号与槽connect(P_PlayerObject,SIGNAL(positionChanged(qint64)),this,SLOT(HandleLCDNumberTimeChangeFunc(qint64)));connect(P_PlayerObject,SIGNAL(positionChanged(qint64)),this,SLOT(HandlePositionChangeFunc(qint64)));connect(P_PlayerObject,SIGNAL(positionChanged(qint64)),this,SLOT(HandleProgressTimeChangeFunc(qint64)));connect(NetworkAccessManagers,SIGNAL(finished(QNetworkReply*)),this,SLOT(HandleDataBackFun(QNetworkReply*)));
}

初始化这些操作包括了把光标设置在搜索栏中,对富文本的处理也就是 对歌曲列表中的数据进行处理,然后就是当歌曲进度条位置发生改变时,对时间,播放的歌曲等进行槽函数的连接。

我们来逐一击破:

搜索歌曲 :

//搜索歌曲名称
void MainWindow::on_pushButton_serch_clicked()
{QString str1,str2;str1=ui->lineEdit_inputMusic->text();str2="http://music.163.com/api/search/get/web?csrf_token=hlpretag=&hlposttag=&s={"+str1+"}&type=1&offset=0&total=true&limit=1";QNetworkRequest networkquest;networkquest.setUrl(str2);//将请求的格式给请求对象//使用这个类对应的api发送get请求并获取响应数据NetworkAccessManagers->get(networkquest);//请求处理
}

搜索歌曲时,我们要定义两个对象,一个用来存储歌曲名称,一个用来去存储搜索这个歌曲的api连接 。然后定义一个网络请求对象去处理str2并获取响应数据。

处理返回数据信息:

处理返回信息我们定义的是:

void HandleDataBackFun(QNetworkReply *pReply);

那我们来实现他:

首先读取到他返回的参数信息。

QByteArySearchInfo=pReply->readAll();

但是如果我们打错了歌曲名称,或者他曲库中没有怎么办呢?

答:我们要定义错误信息来处理他。

QJsonParseError JsonPError;//定义错误信息对象//将json文本转换为json对象处理QJsonDocument JsonDoc_RecvData=QJsonDocument::fromJson(QByteArySearchInfo,&JsonPError);//判断是否符合规则if(JsonPError.error!=QJsonParseError::NoError){QMessageBox::critical(this,"JsonPError","提示:搜索歌曲格式错误,请重新检查",QMessageBox::Yes);return;}
QJsonDocument::fromJson(QByteArySearchInfo,&JsonPError);

QJsonDocument是Qt框架提供的用于处理JSON格式数据的类。

在这里,JsonDoc_RecvData是一个QJsonDocument对象,通过QJsonDocument::fromJson()函数从一个QStringQByteArray类型的JSON格式数据中解析出来。其中,QByteArySearchInfo是一个QByteArray类型的JSON格式数据,JsonPError是一个QJsonParseError对象,用于存储解析JSON数据时可能发生的错误信息。如果解析成功,JsonDoc_RecvData将包含JSON数据的所有内容,我们可以通过JsonDoc_RecvData提供的API来访问和操作这些数据。如果解析失败,JsonPError将包含错误信息以及出错位置等相关信息。

//QJsonObject使用函数object()QJsonObject JsonTotalObject=JsonDoc_RecvData.object();//列出json里面所有的keyQStringList strKeys=JsonTotalObject.keys();if(strKeys.contains("result")){//有数据信息继续//将带有result的数据内容提取之后转换为对象QJsonObject resultobject=JsonTotalObject["result"].toObject();//存储所有的keysQStringList strResultKeys=resultobject.keys();//如果keys是songs,整明搜索的是歌曲if(strResultKeys.contains("songs")){QJsonArray jsonarray=resultobject["songs"].toArray();//通过for循环查找歌曲当中的字段信息for(auto isong:jsonarray){QJsonObject jsonobject1=isong.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();}}}}}

将JsonDoc_RecvData转化为QJsonObject格式存储到JsonTotalObject中,并通过strKeys获取“关键字”,如果提取到的是result,那么进一步进行提取,直到提取所有的信息,包括歌手,歌曲id等下信息。

 QString strURL;strURL=QString("https://music.163.com/song/media/outer/url?id=%0").arg(Music_ID);P_Playerlist->addMedia(QUrl(strURL));//把搜索到的歌曲和歌手添加到歌曲列表中。ui->plainTextEdit_MusicList->appendPlainText(StrMusicName+"-"+StrSingerName);
  • 在这个代码段中,strURL是一个QString类型的对象,通过QString的构造函数将一个字符串常量转换成了一个QString类型的对象,
  • 然后使用arg函数来格式化字符串,将Music_ID的值替换到字符串中的%0处,得到最终的URL地址。
  • 然后,使用QUrl将字符串转换成了一个URL对象,最后通过P_Playerlist->addMedia函数将URL添加到播放列表中。
  • ui->plainTextEdit_MusicList->appendPlainText函数用于将StrMusicName和StrSingerName拼接成一个字符串,并将其添加到文本框中。

完整代码:

void MainWindow::HandleDataBackFun(QNetworkReply *pReply)
{//读取网络回馈的数据QByteArySearchInfo=pReply->readAll();QJsonParseError JsonPError;//定义错误信息对象//将json文本转换为json对象处理QJsonDocument JsonDoc_RecvData=QJsonDocument::fromJson(QByteArySearchInfo,&JsonPError);//判断是否符合规则if(JsonPError.error!=QJsonParseError::NoError){QMessageBox::critical(this,"JsonPError","提示:搜索歌曲格式错误,请重新检查",QMessageBox::Yes);return;}//QJsonObject使用函数object()QJsonObject JsonTotalObject=JsonDoc_RecvData.object();//列出json里面所有的keyQStringList strKeys=JsonTotalObject.keys();if(strKeys.contains("result")){//有数据信息继续//将带有result的数据内容提取之后转换为对象QJsonObject resultobject=JsonTotalObject["result"].toObject();//存储所有的keysQStringList strResultKeys=resultobject.keys();//如果keys是songs,整明搜索的是歌曲if(strResultKeys.contains("songs")){QJsonArray jsonarray=resultobject["songs"].toArray();//通过for循环查找歌曲当中的字段信息for(auto isong:jsonarray){QJsonObject jsonobject1=isong.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/puter/url?id=%0").arg(Music_ID);P_Playerlist->addMedia(QUrl(strURL));//把搜索到的歌曲和歌手添加到歌曲列表中。ui->plainTextEdit_MusicList->appendPlainText(StrMusicName+"-"+StrSingerName);
}

代码运行结果:

感谢阅读!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/13891.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pytorch DDP分布式细节分享

自动微分和autograde 自动微分 机器学习/深度学习关键部分之一&#xff1a;反向传播&#xff0c;通过计算微分更新参数值。 自动微分的精髓在于它发现了微分计算的本质&#xff1a;微分计算就是一系列有限的可微算子的组合。 自动微分以链式法则为基础&#xff0c;依据运算逻…

kubeadm部署k8s v1.28

一、主机准备 主机硬件配置说明 作用IP地址操作系统配置k8s-master01192.168.136.55openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node01192.168.136.56openEuler-22.03-LTS-SP12颗CPU 4G内存 50G硬盘k8s-node02192.168.136.57openEuler-22.03-LTS-SP12颗CPU 4G内存 50G…

安全生产月答题pk小程序怎么做

在当今信息化时代&#xff0c;小程序已成为人们日常生活和工作中不可或缺的一部分。特别是在安全生产领域&#xff0c;通过小程序进行答题PK活动&#xff0c;不仅可以提高员工的安全意识&#xff0c;还能促进团队间的协作与交流。本文将详细介绍如何制作一款安全生产月答题PK小…

初识DataX3.0

目前接到任务&#xff0c;让同步表数据。市面很多同步工具不一一尝试了&#xff0c;信赖阿里&#xff0c;所以调研了一下阿里的dataX,一点点来吧&#xff0c;学习为主 环境准备&#xff1a;linux6.8 python自带的2.7 MySQL 5.7.1 1.先下载&#xff1a; wget http://datax-o…

油猴脚本使用cookie一般是某请求返回的setcookie,一般不是js生成的,直接请求拼接

写完hook脚本 删除页面cooike&#xff0c;打开开发者模式&#xff0c;刷新页面 cookie一般是某请求返回的setcookie,一般不是js生成的&#xff0c;直接请求拼接带cookie请求 看网络里的cookie httponly打钩的是服务器返回的&#xff0c;但不一定对&#xff0c;还是要看保存日…

MPLS VPN

不是公司的产品&#xff0c;是运营商对外提供的一种服务 没咋懂&#xff0c;oh my god

安防监控视频平台EasyNVR级联视频上云系统EasyNVS出现“Login error”报错的原因排查

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

Milvus的执行引擎Knowhere

前言 本文将会介绍Knowhere这个概念&#xff0c;它是milvus向量执行引擎的核心。 概览 Knowhere是milvus向量咨询引擎的核心&#xff0c;它将好几个向量相似搜索库聚集在一起&#xff08;包括faiss、hnswlib、annoy&#xff09;。Knowhere也被设计支持异构计算。它控制在什么…

电商平台api接口:采购比价可用的比价工具推荐

电商平台api接口 目前&#xff0c;许多企业在进行内部采购时都有比价的需求。企业利用比价采购这一方式&#xff0c;能通过对比不同平台上、不同供应商的报价&#xff0c;进而选择最符合其需求和预算的产品或服务。 在比价采购的流程中&#xff0c;最重要的步骤就是企业在明确…

C#Csharp,SharpPcap网络抓包程序及源码(适合网络分析直接使用或源码二次开发)

目录 1.程序简介2.程序截图3.程序源码 1.程序简介 C#Csharp,SharpPcap网络抓包程序及源码&#xff08;适合网络分析直接使用或源码二次开发&#xff09; 2.程序截图 3.程序源码 https://download.csdn.net/download/xzzteach/89325817

沃创云外呼系统——能够企业带来什么样的帮助

沃创云外呼系统是一款功能强大的呼叫系统&#xff0c;能够助力企业提升营销效率&#xff0c;实现业绩增长。以下是沃创云外呼系统具体可以为企业带来的帮助 01节约成本 沃创云外呼系统能够自动拨打海量客户电话号码&#xff0c;降低企业成本&#xff0c;提高工作效率。使用沃创…

EI会议论文的格式和模板在哪里可以找到?

要找到EI会议论文的格式和模板&#xff0c;首先访问会议的官方网站&#xff0c;这是最直接的途径。会议网站通常在下载中心或投稿指南中提供详细的模板和格式要求。此外&#xff0c;你也可以查阅会议通知邮件、合作出版社平台、往届会议论文&#xff0c;或者直接联系会议组织者…

go语言中的一个特别的语法 //go:embed 可将将静态文件内容读取到string, []byte和 embed.FS 变量并直接打包到exe包中

go语言中的一个特别的语法 //go:embed 看上去像是注释&#xff0c;实则是golang中的一个内置的语法&#xff0c;而且是仅在你的go代码编译时生效的语法&#xff0c; 借助他我们可以将我们的静态资源文件读取到FS直接打包到我们的exe执行文件中。 同时他还支持文件的模式匹配…

计算机网络学习小结_数据链路层

数据链路和帧 帧&#xff1a;数据链路层传输基本单元。链路层将网络层传过来的数据构成帧发到链路上&#xff0c;并将发到链路层的帧取出数据交给网络层 数据报/分组/包&#xff1a;网络层传输基本单元 三个基本问题 即封装成帧、透明传输、差错检测 封装成帧 概念&#…

Docker Portainer使用

Portainer是什么 Docker Portainer是一个轻量级的 Web UI 管理界面,可以用来管理Docker环境。它提供了一个直观的控制台,用户可以通过它来管理Docker主机、容器、网络、卷等Docker资源。 Portainer的主要功能和特点包括: 容器管理:可以查看、启动、停止、删除容器,以及查看容器…

VSCODE调试C++(本人是openfoam求解器)时无法显示Vector,map等容器的值

一维数组&#xff1a; 可以在watch内添加表达式&#xff1a;*(type(*)[size])vectorName 例如&#xff1a;想查看vector<int> nums(6), 可以添加*(int(*)[6])nums。 上面是一维数组情况&#xff1a; ((double (*)[1000])&U[1000]) 表示从下标1000开始访问1000-200…

Qt 科目一考试系统(有源码)

项目源码和资源&#xff1a;科目一考试系统: qt实现科目一考试系统 一.项目概述 该项目是一个基于Qt框架开发的在线考试系统&#xff0c;主要实现了考试题目的随机抽取、考试时间限制、成绩统计等功能。用户可以通过界面操作进行考试&#xff0c;并查看自己的考试成绩。 二.技…

threejs的基本属性

1.创建场景,摄像机,渲染器,几何体,材质,网格 网格 物体材质 场景.add(网格),网格加入场景中 场景.add(坐标辅助器) 渲染 场景摄像机 相机的轨道控制器是个单独的对象 import ./style.css import * as THREE from three import { OrbitControls } from three/examples/j…

利用element实现简单右键

利用element-plus中的el-menu实现简单右键 实现如下 <template><main class"mainClass" contextmenu"showMenu($event)"> </main><el-menu:default-active"1"class"el-menu-demo"mode"vertical":col…

操作系统入门系列-MIT6.828(操作系统工程)学习笔记(一)---- 操作系统介绍与接口示例

MIT6.S081&#xff08;操作系统&#xff09;学习笔记 操作系统入门系列-MIT6.S081&#xff08;操作系统&#xff09;学习笔记&#xff08;一&#xff09;---- 操作系统介绍与接口示例 操作系统入门系列-MIT6.828&#xff08;操作系统工程&#xff09;学习笔记&#xff08;二&a…