行业知识
保姆级教学QT实战项目:基于QT的音乐播放器(一)
2026-11-11 01:29:09
来源:互联网转载
UI界面我就不细说了,可以自行参照设计,实现的功能有:
1.搜索网络歌曲,但是这个网络歌曲是自己模拟的服务器,与各大音乐软件服务器或者API什么的无关
2.歌词同步
3.随机播放,上一首,下一首,暂停播放。主要就是这些按钮控件。
最右边的按键就是歌曲列表与歌词页面的切换按钮
最左边的为随机播放功能开启和关闭
一、演示:
文件夹按钮为:有config文件配置,但是我这里没有进行显示,理由就是同上面显示的一样的操作,为了赶进度就没实现了,但是道理是一样的。
学完本项目可以了解一下QT中的:http请求,json分析,数据库操作,多线程操作,以及文件操作,专辑图像处理本程序并未实现,大家可以自行补充QT中的图像处理相关知识。
所以接下来我们先实现搜索网络歌曲部分。
以下是实现http功能的源代码
二、http请求部分(MusicHttp)
MusicHttp.h
#include #include //处理网络请求和接收响应的一个核心类#include //url地址#include //接收返回数据#include //发送请求#include //文件操作,读取数据需要保存在文件#include class MusicHttp : public QObject{ Q_OBJECTpublic: //枚举请求状态 enum MusicHttpState{ MusicFailHttp, MusicSuccessHttp, }; explicit MusicHttp(const QString &filename,QObject *parent = nullptr); bool GetHttpState(); void setFilename(const QString &value); void onGet(const QString& httpurl); void onreadyRead(); QByteArray onreadData(); void onhandFinished(); void onhandError(QNetworkReply::NetworkError code);signals: void readyRead(); void error();public slots:private: QString filename;//文件名 QNetworkAccessManager* networkManager;//请求对象 enum MusicHttpState httpstate;//判断请求成功还是失败};#endif // MUSICHTTP_H MusicHttp.cpp
/*第一,我们要创建一个网络管理对象,用于发送和接收http请求同时我们还需要一个文件,用于存放请求接受的数据,因为搜索一首歌可以有多个返回结果,所以每次都需要重新写入文件,我用的是 if(QFile::exists(filename)) QFile::remove(filename);第二,我自己枚举了请求状态,成功或失败都应该进行处理,成功可以返回搜索结果,失败可以弹出对话框,比如说因为网络问题请求失败第三,只要连接成功并且接收到数据,QNetworkReply会发出readyRead信号,但是如果文件太大,那会分几次发送,所以我连接了onreadyRead函数,对接受到的数据进行写入,只有当数据接收完,该类发送finished的时候我自定义一个readyRead信号,接受到自定义的信号然后对文件进行读取,所以有两个readyRead信号,不要搞混淆了。一个是自定义,一个是QNetworkReply的。不过该类在连接失败的时候也会发送finished信号,所以发送了一个自定义的错误信号,可以对该信号进行捕获做出对应的处理操作。第四,可能onGet(const QString& httpurl),可能对这个存在不理解,为什么是这个参数,而且没有调用,但是我们是要根据按下搜索的回车键进行搜索,与其他类配合使用,所以先记下这个参数,往后其他类实现会提及。第五,实际上我们得到的是json数据,但是这个json数据是我自己参照写的,需要对这个json进行分析,后面有类会对其进行分析,如果要得到真正的json文件需要用到爬虫,本人不会,所以只好自己仿制了。第六,用到的QT中的类还比较简单,有需要的伙伴可以自行查看帮助手册*/#include "musichttp.h"MusicHttp::MusicHttp(const QString &filename,QObject *parent) : QObject(parent),filename(filename){ networkManager = new QNetworkAccessManager(this); //将请求状态初始化为成功 httpstate=MusicHttpState:: MusicSuccessHttp;}//发送请求部分void MusicHttp::onGet(const QString& httpurl){ if(QFile::exists(filename)){ QFile::remove(filename); } //连接服务器的返回状态初始化为成功 httpstate=MusicHttpState:: MusicSuccessHttp; //创建url对象,也就是设置url地址 QUrl url(httpurl); //创建一个请求对象,用于发送请求 QNetworkRequest request(url); //发送请求,返回一个reply对象 //该返回对象接受到数据会发送readyRea信号 QNetworkReply *reply = networkManager->get(request); connect(reply,&QNetworkReply::readyRead,this,&MusicHttp::onreadyRead); //数据发送完毕或者是请求失败,发出finished信号,处理该信号 connect(reply,&QNetworkReply::finished,this,&MusicHttp::onhandFinished); //请求失败处理部分 //对请求失败进行输出,输出失败原因 connect(reply,SIGNAL(error(QNetworkReply::NetworkError)),\ this,SLOT(onhandError(QNetworkReply::NetworkError)));}//处理请求完成void MusicHttp::onhandFinished(){ QNetworkReply *reply =(QNetworkReply *)this->sender(); //如果不是请求失败,则发出readyRead信号,表示可以读取数据 if(reply->error() == QNetworkReply::NoError){ emit readyRead(); } reply->deleteLater();}//处理请求失败void MusicHttp::onhandError(QNetworkReply::NetworkError code){ qDebug()
上一篇:据说的拼音怎么拼写?
下一篇:服务器怎么扩容硬盘?