基于QT的音乐播放器
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                基于QT的音乐播放器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                功能實現:
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的音乐播放器的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 前端学习(1862)vue之电商管理系统
 - 下一篇: 前端学习(1526):heroes案例