小工具知识网

当前位置: 首页 > 行业知识 > 保姆级教学QT实战项目:基于QT的音乐播放器(一)

行业知识

保姆级教学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()

上一篇:据说的拼音怎么拼写?

下一篇:服务器怎么扩容硬盘?