功能实现:

1、可以打开本地音乐文件,实现添加音乐
2、上一曲,下一曲,暂停功能基本实现
3、也实现了网易云端的连接,通过json文件的解析得到所需要的歌曲
4、关于json ----需要了解json数据格式的基本要求:

json对象、json数组、以及Qjson相关类的使用,对其中的元素遍历

Json类 介绍
QJsonDoucument 它封装了一个完整的 JSON 文档,并且可以从 UTF-8 编码的基于文本的表示以及 Qt 自己的二进制格式读取和写入该文档。
QJsonArray JSON 数组是一个值列表。可以通过从数组中插入和删除 QJsonValue 来操作该列表。
QJsonObject JSON 对象是键值对的列表,其中键是唯一的字符串,值由 QJsonValue 表示。
QJsonValue 该类封装了 JSON 支持的数据类型。

头文件部分:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include    <QMainWindow>
#include    <QMediaPlayer>
#include    <QMediaPlaylist>
#include    <QNetworkAccessManager>
#include     <QNetworkReply>
#include <QVideoWidget>
#include <Qstring>#include <QJsonDocument>//解析头文件
#include <QJsonObject>
#include <QJsonArray>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECT
signals:void mediaAdd(QString url);//发出解析到的urlpublic:explicit MainWindow(QWidget *parent = 0);void parseJson_getAlbumID(QString json);void parseJson_getplay_url(QString json);~MainWindow();private slots:void on_up_clicked();void on_play_clicked();void on_stop_clicked();void on_next_clicked();void on_add_clicked();void on_move_clicked();void onStateChanged(QMediaPlayer::State state);
void onPositionChanged(qint64 position);
void onDurationChanged(qint64 duration);
void onPlaylistChanged(int position);void on_listWidget_doubleClicked(const QModelIndex &index);void on_Slider2_sliderMoved(int position);void on_Slider_sliderMoved(int position);//void on_toolButton_clicked();void on_toolButton_2_clicked();void on_toolButton_clicked();void replyFinished(QNetworkReply*);    //api发送完成void replyFinished2(QNetworkReply*);   //url发送完成private:Ui::MainWindow *ui;QMediaPlayer    *player;//播放器QMediaPlaylist  *playlist;//播放列表QString  palylong;//总长度QString  current;//当前播放到位置bool mute;//QNetworkAccessManager *http_acc;QNetworkAccessManager *https_acc;QNetworkAccessManager *https_acc1;int song_idStr;QStringList url_list;bool bo_zan = true;
};#endif // MAINWINDOW_H

mainwindow.cpp部分:

#include "mainwindow.h"
#include "ui_mainwindow.h"#include    <QFileDialog>
#include    <QNetworkRequest>
#include    <QFileDialog>
#include   <QDebug>
#include    <QBitmap>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{QPixmap Images(":/20.jpeg");QPalette Palette = this->palette();Palette.setBrush(QPalette::Background,Images);this->setPalette(Palette);setMask(Images.mask());ui->setupUi(this);player = new QMediaPlayer(this);playlist = new QMediaPlaylist(this);playlist->setPlaybackMode(QMediaPlaylist::Loop); //循环模式player->setPlaylist(playlist);connect(player,SIGNAL(stateChanged(QMediaPlayer::State)),this, SLOT(onStateChanged(QMediaPlayer::State)));connect(player,SIGNAL(positionChanged(qint64)),this, SLOT(onPositionChanged(qint64)));connect(player,SIGNAL(durationChanged(qint64)),this, SLOT(onDurationChanged(qint64)));connect(playlist,SIGNAL(currentIndexChanged(int)),this, SLOT(onPlaylistChanged(int)));this->setWindowTitle("音乐播放器");this->setWindowIcon(QIcon(":/20.png"));//https  搜索歌曲https_acc = new QNetworkAccessManager;connect(https_acc, SIGNAL(finished(QNetworkReply*)), this , SLOT(replyFinished(QNetworkReply*)));https_acc1= new QNetworkAccessManager;connect(https_acc1, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished2(QNetworkReply*)));//     //定义音乐播放器
//     playlist = new QMediaPlaylist;
//     player = new QMediaPlayer;ui->lineEdit->setText("曹操");}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::onStateChanged(QMediaPlayer::State state)
{//播放器状态变化,更新按钮状态ui->play->setEnabled(!(state==QMediaPlayer::PlayingState));ui->stop->setEnabled(state==QMediaPlayer::PlayingState);}
void MainWindow::onPositionChanged(qint64 position)
{//当前文件播放位置变化,更新进度显示if (ui->Slider->isSliderDown())return;ui->Slider->setSliderPosition(position);//int   secs=position/1000;//秒int   mins=secs/60; //分钟secs=secs % 60;//余数秒current=QString::asprintf("%d:%d",mins,secs);ui->label->setText(current+"/"+palylong);
}
void MainWindow::onDurationChanged(qint64 duration)
{//文件时长变化,更新进度显示ui->Slider->setMaximum(duration);int   secs=duration/1000;//秒int   mins=secs/60; //分钟secs=secs % 60;//余数秒palylong=QString::asprintf("%d:%d",mins,secs);ui->label->setText(current+"/"+palylong);}void MainWindow::onPlaylistChanged(int position)
{//播放列表变化,更新当前播放文件名显示ui->listWidget->setCurrentRow(position);QListWidgetItem  *item=ui->listWidget->currentItem();if (item)ui->label_3->setText(item->text());
}void MainWindow::on_up_clicked()
{//前一文件playlist->previous();
}void MainWindow::on_play_clicked()
{//播放音乐for(int i=0; i < url_list.length(); i++){playlist->addMedia(QUrl(url_list.at(i)));}player->setPlaylist(playlist);if(bo_zan == true){player->play();bo_zan =false;}
//    if (playlist->currentIndex()<0)
//        playlist->setCurrentIndex(0);
//        player->play();
}void MainWindow::on_stop_clicked()
{//暂停播放if(bo_zan = false){player->pause();player->stop();bo_zan = true;}
}void MainWindow::on_next_clicked()
{//下一文件playlist->next();
}void MainWindow::on_add_clicked()
{//添加文件QString curPath=QDir::homePath();//获取系统当前目录QString dlgTitle="选择音频文件"; //对话框标题QString filter="音频文件(*.mp3 *.wav *.wma);;mp3文件(*.mp3);;wav文件(*.wav);;wma文件(*.wma);;所有文件(*.*)"; //文件过滤器QStringList fileList=QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter);if (fileList.count()<1)return;for (int i=0; i<fileList.count();i++){QString aFile=fileList.at(i);playlist->addMedia(QUrl::fromLocalFile(aFile));//添加文件QFileInfo   fileInfo(aFile);ui->listWidget->addItem(fileInfo.fileName());//添加到界面文件列表}if (player->state()!=QMediaPlayer::PlayingState)playlist->setCurrentIndex(0);player->play();
}void MainWindow::on_move_clicked()
{//移除一个文件int pos=ui->listWidget->currentRow();QListWidgetItem *item=ui->listWidget->takeItem(pos);delete item;//从listWidget里删除if (playlist->currentIndex()==pos) //是当前播放的曲目{int nextPos=0;if (pos>=1)nextPos=pos-1;playlist->removeMedia(pos);//从播放列表里移除if (ui->listWidget->count()>0){playlist->setCurrentIndex(nextPos);onPlaylistChanged(nextPos);}else{player->stop();}}elseplaylist->removeMedia(pos);
}void MainWindow::on_listWidget_doubleClicked(const QModelIndex &index)
{//双击时切换播放文件int rowNo=index.row();playlist->setCurrentIndex(rowNo);player->play();
}void MainWindow::on_Slider2_sliderMoved(int position)
{//调整音量player->setVolume(position);if(position==0){ui->toolButton_2->setIcon(QIcon(":/21.png"));}if(position!=0&&mute==true){ui->toolButton_2->setIcon(QIcon(":/6.png"));}}void MainWindow::on_Slider_sliderMoved(int position)
{//文件进度调控player->setPosition(position);
}void MainWindow::on_toolButton_2_clicked()
{mute=player->isMuted();player->setMuted(!mute);if (mute)ui->toolButton_2->setIcon(QIcon(":/6.png"));elseui->toolButton_2->setIcon(QIcon(":/21.png"));}
void MainWindow::replyFinished(QNetworkReply* reply)   //发送api请求完成
{//获取响应的信息,状态码为200表示正常QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);//无错误返回if(reply->error() == QNetworkReply::NoError){QByteArray bytes = reply->readAll();  //获取字节QString result(bytes);  //转化为字符串parseJson_getAlbumID(result);  //自定义方法,解析歌曲数据}else{//处理错误qDebug()<<"处理错误";}}
void MainWindow::parseJson_getAlbumID(QString json)     //解析接收到的歌曲信息,得到歌曲ID
{QByteArray byte_array;QJsonParseError json_error;QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array.append(json), &json_error);if(json_error.error == QJsonParseError::NoError){if(parse_doucment.isObject()){QJsonObject rootObj = parse_doucment.object();if(rootObj.contains("result")){QJsonValue re_obj = rootObj.value("result");if(re_obj.isObject()){QJsonObject roj = re_obj.toObject();if(roj.contains("songs")){QJsonValue valuedata = roj.value("songs");if (valuedata.isArray()){QJsonArray array = valuedata.toArray();int size = array.size();for(int i = 0;i < size; i++)  //songs json数组遍历找到ID{QJsonValue value = array.at(i);if(value.isObject()){QJsonObject object = value.toObject();if(object.contains("id")){QJsonValue ID_value = object.value("id");if(ID_value.isDouble()){song_idStr = ID_value.toInt(); //歌曲ID信息qDebug()<< song_idStr;}}//通过歌曲ID发送请求,得到歌曲urlQNetworkRequest request;request.setUrl(QString("https://autumnfish.cn/song/url?id=%0").arg(song_idStr));https_acc1->get(request);}}}}}}}}else{qDebug()<<json_error.errorString();}
}void MainWindow::replyFinished2(QNetworkReply *reply)       //通过歌曲ID搜索   发送搜索请求完成,接受到信息,然后进行解析     通过歌曲ID搜索
{//获取响应的信息,状态码为200表示正常QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);//无错误返回if(reply->error() == QNetworkReply::NoError){QByteArray bytes = reply->readAll();  //获取字节QString result(bytes);  //转化为字符串parseJson_getplay_url(result);  //自定义方法,解析歌曲数据}else{//处理错误qDebug()<<"处理错误";}
}
void MainWindow::parseJson_getplay_url(QString json)        //解析得到歌曲
{QByteArray byte_array;QJsonParseError json_error;QJsonDocument parse_doucment = QJsonDocument::fromJson(byte_array.append(json), &json_error);if(json_error.error == QJsonParseError::NoError){if(parse_doucment.isObject()){QJsonObject rootObj = parse_doucment.object();if(rootObj.contains("data")){QJsonValue valuedata = rootObj.value("data");if (valuedata.isArray()){QJsonArray array = valuedata.toArray();int size = array.size();for(int i = 0;i < size; i++)  //id   json数组遍历找到ID对应的url{QJsonValue value = array.at(i);if(value.isObject()){QJsonObject object = value.toObject();if(object.contains("url")){QJsonValue song_url_value = object.value("url");if(song_url_value.isString()){QString song_url = song_url_value.toString();url_list.append(song_url);
//                                              qDebug()<< song_url.toStdString().c_str();}}}}}}}}
}void MainWindow::on_toolButton_clicked()
{//发送一个https请求QNetworkRequest request;request.setUrl(QString("https://music.cyrilstudio.top/search?keywords=%0").arg(ui->lineEdit->text()));https_acc->get(request);
}

main.cpp部分:

#include "mainwindow.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

效果图:

未能实现的功能:

        歌词的动态显示,在线搜索歌曲只能从第一首播放(但也可以通过修改url的数组的方式来更改),不能重复搜索,必须关闭此界面才能重新检索歌曲------也是此软件的不足之处。

总结:

        在编程过程中,从最开始的构思很清晰,到实际编程的时候的不知所措,过程中对QT 中基本函数的不熟悉,以及对未知函数的恐惧,还有就是阅读英文文档的能力有待提高,比如这里Qjson的使用,经过仔细的研读,以及查阅资料,也算是大概了解,还有就是代码量上去之后,由于自己编程取名的不规范,导致调试过程很繁乱----一大忌讳,通过此次编程练习,对的信号与槽的应用越来越熟悉,Qt面向对象编程的思想已经能够由最初的过程编程思想的固化到完全理解。不错的一个练习。。

基于QT的音乐播放器相关推荐

  1. 基于Qt的音乐播放器(二)切换歌曲,调节音量,调节语速,暂停

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 1.切换歌曲 2.调节音量 3.调节语速 4.播放/暂停 5.我们来看下效果 6.关于上一篇提 ...

  2. 基于Qt的音乐播放器制作

    基于Qt的音乐播放器制作 使用浏览器自带工具抓包歌曲资源 开发人员工具抓包 点击浏览器右上角的 "-" 快捷键(Alt + F): 点击其中的"更多工具" ➡ ...

  3. 基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 1.实现音频文件对话框(QFileDialog类) 2.实现音乐播放(QMediaPlayer ...

  4. 基于Qt的音乐播放器(三)通过酷狗音乐的api接口,返回json格式歌曲信息(播放地址,歌词,图片)

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 文章目录 前言 1.获取歌曲搜索列表api接口 2.获取单个歌曲详细信息包括歌词 3.总结 前言 首先说 ...

  5. 【QT的音乐播放器(简单版)】

    基于QT的音乐播放器 前言 一.主体效果 二.主要技术点: 1. mp3的ID3V2格式文件解析:作者.歌手.时长.专辑图片等 1.1 需要工具: 1.2 ID3V2文件格式 1.3 mp3ID3V2 ...

  6. 音频频谱显示-基于fmod设计音乐播放器并动态显示频谱图(二)

    音频频谱显示-显示音频文件静态频谱图(一) https://blog.csdn.net/xiaolong1126626497/article/details/126971535 音频频谱显示-基于fm ...

  7. Qt+MPlayer音乐播放器开发笔记(二):交叉编译MPlayer以及部署到开发板播放演示

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/119991329 长期持续带来更多项目与技术分享,咨询请 ...

  8. 基于QT实现Mp3播放器(代码部分)

    前言     最近有一个课程实验,利用window上的API接口实现MP3播放器. 突发奇想,在linux下用相关接口做一个MP3播放器.最先的打算是完全使用纯C写的,但后来感觉编写调试实在费劲.于是 ...

  9. 基于QT实现Mp3播放器(理论论述部分)

    前言     最近有一个课程实验,利用window上的API接口实现MP3播放器. 突发奇想,在linux下用相关接口做一个MP3播放器.最先的打算是完全使用纯C写的,但后来感觉编写调试实在费劲.于是 ...

  10. 基于python的音频播放器_基于python实现音乐播放器代码实例

    基于python实现音乐播放器代码实例,一首,函数,按钮,布局,音乐 基于python实现音乐播放器代码实例 易采站长站,站长之家为您整理了基于python实现音乐播放器代码实例的相关内容. 核心播放 ...

最新文章

  1. 借力5G,云VR将推动VR产业迎“第二春”
  2. Spring Cloud构建微服务架构:分布式服务跟踪(抽样收集)【Dalston版】
  3. HDU 6264 Super-palindrome
  4. go reflect的用法
  5. 把SAP Analytics Cloud嵌入到SAP Cloud for Customer系统里
  6. lsof -i:port 的作用
  7. UML类图介绍及简单用法
  8. Animation Framework
  9. ecshop商品列表页增加/显示货号SN
  10. 一个Android健身APP源码(类似KEEP、FEEL、轻+、减约、薄荷等)
  11. GSM模块(SIM800L)收发短信 串口调试
  12. SOFA BOLT源码解析之设计要点-网络IO
  13. 【.Net实用方法总结】 整理并总结System.IO中Path类及其方法介绍
  14. 定时任务ScheduledExecutorService
  15. 使用SendCloud企业发送邮件
  16. mysql容灾方案_mysql 架构 ~异地容灾
  17. matlab绘图实例-绘制双纵轴曲线图
  18. job处理缓慢的性能问题排查与分析(r4笔记第18天)
  19. ubuntu安装HBuilder过程
  20. 前端工程师需要学习ps 吗_【百度前端工程师面试】前端开发技术要会PS-看准网...

热门文章

  1. linux系统iso文件详解,ISO镜像文件解析
  2. 哥德巴赫猜想-中文维基百科
  3. Linux-安全加固
  4. 《Unix传奇》:众神的创世记
  5. 黑苹果无线网卡的另一种解决方案
  6. 二分算法和冒泡排序时间复杂度分析
  7. 网址采集器-批量URL网站链接提取-批量关键词网站采集
  8. Ardunio开发实例-雨滴传感器
  9. 解决java.lang.NoClassDefFoundError: com.android.tools.fd.runtime.AppInfo
  10. 遥感图像的辐射畸变与辐射校正