基于QT實現(xiàn)本地音樂播放器
1.IDE
QTCreator
2.實驗
之前做的音樂播放器只做了一個界面,是因為跟的課程發(fā)現(xiàn)到后面需要付費,并且WINGW6.2.0運行QMediaPlayer時無法運行,會崩潰,現(xiàn)在退一步用
WINGW5.12.2做一個本地音樂播放器
3.記錄
(1)鼠標(biāo)懸停,背景顏色改變
(2)listwidget以及水平滑塊
(3)雙擊播放音樂的實現(xiàn)
void Widget::on_listWidget_doubleClicked(const QModelIndex &index) //雙擊播放指定音樂 { mediaplayer->setMedia(playlist[index.row()]); mediaplayer->play(); }
(4)打開文件夾的實現(xiàn)
void Widget::on_openfile_pb_clicked() //打開文件按鈕按下 { //QMessageBox::information(this,"文件","打開文件"); //打開對話框,讓用戶選擇音樂的存放路徑 auto path=QFileDialog::getExistingDirectory(this,"選擇音樂所在的路徑","c:/Users/***/Desktop/music_path"); //打開指定文件夾***涉及個人信息 // qInfo()<<path; //打印剛才打開文件夾 QDir dir(path); // auto musiclist=dir.entryList(QStringList()<<"*.mp3"<<"*.wav"); //篩出mp3和wav文件 // qInfo()<<musiclist; //打印帥選后的音樂 //把篩選出的文件在listwidget顯示出來 ui->listWidget->addItems(musiclist); //默認選擇第一首音樂 ui->listWidget->setCurrentRow(0); //把音樂完整路徑保存起來 for(auto file : musiclist) playlist.append(QUrl::fromLocalFile(path+"/"+file)); //append附加 // qInfo()<<playlist; //將附加的音樂列表打印出來 }
(5)播放的實現(xiàn)
void Widget::on_playorpause_pb_clicked() //播放或者暫停按下 { if(mediaplayer->state()!=QMediaPlayer::PlayingState) //不處于播放狀態(tài) { //得到音樂索引 int index=ui->listWidget->currentRow(); //設(shè)置音樂路徑 mediaplayer->setMedia(playlist[index]); } //判斷當(dāng)前狀態(tài) switch(mediaplayer->state()) { case QMediaPlayer::StoppedState:mediaplayer->play();break; case QMediaPlayer::PausedState:mediaplayer->play();break; //停止則播放 case QMediaPlayer::PlayingState:mediaplayer->pause();break; //正在播放則暫停 // default:mediaplayer->play();break; } }
(6)上一首,下一首的實現(xiàn)
void Widget::on_lastsong_pb_clicked() //上一首 { int index=ui->listWidget->currentRow(); if(index==0) //如果在第一行 ui->listWidget->setCurrentRow(ui->listWidget->count()-1); else ui->listWidget->setCurrentRow(index-1); mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]); mediaplayer->play(); } void Widget::on_next_song_pb_clicked() //下一首 { int index=ui->listWidget->currentRow(); if(index == (ui->listWidget->count()-1)) //如果在最后一首歌 ui->listWidget->setCurrentRow(0); else ui->listWidget->setCurrentRow(index+1); mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]); mediaplayer->play(); }
(7)獲取音樂總時長,當(dāng)前播放進度,改變當(dāng)前播放進度,改變音量的實現(xiàn)
//獲取當(dāng)前文件總播放時間 connect(mediaplayer,&QMediaPlayer::durationChanged,this,[=](qint64 duration) { ui->total_playtime->setText(QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')).arg(duration/1000%60,2,10,QChar('0')));//2為位寬,10為進制,QChar('0')為填充0 ui->play_slider->setRange(0,duration); }); //根據(jù)進度改變當(dāng)前播放時間 connect(mediaplayer,&QMediaPlayer::positionChanged,this,[=](qint64 position) { ui->now_playtime->setText(QString("%1:%2").arg(position/1000/60,2,10,QChar('0')).arg(position/1000%60,2,10,QChar('0')));//2為位寬,10為進制,QChar('0')為填充0 ui->play_slider->setValue(position); }); //拖動滑塊,讓音樂進度隨滑塊改變而改變 connect(ui->play_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setPosition); //拖動滑塊,改變音量 connect(ui->volume_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setVolume);
(8)總體運行效果
4.完整代碼
pro
QT += core gui multimedia widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets CONFIG += c++17 # You can make your code fail to compile if it uses deprecated APIs. # In order to do so, uncomment the following line. #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0 SOURCES += \ main.cpp \ widget.cpp HEADERS += \ widget.h FORMS += \ widget.ui # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target RESOURCES += \ resource.qrc
widget.h
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPaintEvent> #include <QMediaPlayer> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); void paintEvent(QPaintEvent *); private slots: void on_openfile_pb_clicked(); void on_playorpause_pb_clicked(); void on_lastsong_pb_clicked(); void on_next_song_pb_clicked(); void on_listWidget_doubleClicked(const QModelIndex &index); void on_close_pb_clicked(); void on_about_pb_clicked(); private: Ui::Widget *ui; QMediaPlayer *mediaplayer; QList<QUrl> playlist; //播放列表 }; #endif // WIDGET_H
widget.cpp
#include "widget.h" #include "ui_widget.h" #include <QPainter> #include <QMessageBox> //消息提示 #include <QFileDialog> //操作文件 #include <QDir> //操作路徑 #include <QDebug> //#include <QString> #include <QMediaPlayer> #include <QAudioOutput> //音樂輸出 Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); this->setFixedSize(this->geometry().size()); //設(shè)置固定大小 this->setWindowFlag(Qt::FramelessWindowHint); //關(guān)閉窗口標(biāo)題 //定義一個媒體播放對象 mediaplayer = new QMediaPlayer(this); //設(shè)置音量 mediaplayer->setVolume(50); //獲取當(dāng)前文件總播放時間 connect(mediaplayer,&QMediaPlayer::durationChanged,this,[=](qint64 duration) { ui->total_playtime->setText(QString("%1:%2").arg(duration/1000/60,2,10,QChar('0')).arg(duration/1000%60,2,10,QChar('0')));//2為位寬,10為進制,QChar('0')為填充0 ui->play_slider->setRange(0,duration); }); //根據(jù)進度改變當(dāng)前播放時間 connect(mediaplayer,&QMediaPlayer::positionChanged,this,[=](qint64 position) { ui->now_playtime->setText(QString("%1:%2").arg(position/1000/60,2,10,QChar('0')).arg(position/1000%60,2,10,QChar('0')));//2為位寬,10為進制,QChar('0')為填充0 ui->play_slider->setValue(position); }); //拖動滑塊,讓音樂進度隨滑塊改變而改變 connect(ui->play_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setPosition); //拖動滑塊,改變音量 connect(ui->volume_slider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setVolume); } Widget::~Widget() { delete ui; } void Widget::paintEvent(QPaintEvent*) //重新定義畫布 { QPainter paint(this); paint.drawPixmap(0,0,width(),height(),QPixmap(":image/picture/background.jpg")); } void Widget::on_openfile_pb_clicked() //打開文件按鈕按下 { //QMessageBox::information(this,"文件","打開文件"); //打開對話框,讓用戶選擇音樂的存放路徑 auto path=QFileDialog::getExistingDirectory(this,"選擇音樂所在的路徑","c:/Users/***/Desktop/music_path"); //打開指定文件夾 // qInfo()<<path; //打印剛才打開文件夾 QDir dir(path); // auto musiclist=dir.entryList(QStringList()<<"*.mp3"<<"*.wav"); //篩出mp3和wav文件 // qInfo()<<musiclist; //打印帥選后的音樂 //把篩選出的文件在listwidget顯示出來 ui->listWidget->addItems(musiclist); //默認選擇第一首音樂 ui->listWidget->setCurrentRow(0); //把音樂完整路徑保存起來 for(auto file : musiclist) playlist.append(QUrl::fromLocalFile(path+"/"+file)); //append附加 // qInfo()<<playlist; //將附加的音樂列表打印出來 } void Widget::on_playorpause_pb_clicked() //播放或者暫停按下 { if(mediaplayer->state()!=QMediaPlayer::PlayingState) //不處于播放狀態(tài) { //得到音樂索引 int index=ui->listWidget->currentRow(); //設(shè)置音樂路徑 mediaplayer->setMedia(playlist[index]); } //判斷當(dāng)前狀態(tài) switch(mediaplayer->state()) { case QMediaPlayer::StoppedState:mediaplayer->play();break; case QMediaPlayer::PausedState:mediaplayer->play();break; //停止則播放 case QMediaPlayer::PlayingState:mediaplayer->pause();break; //正在播放則暫停 // default:mediaplayer->play();break; } } void Widget::on_lastsong_pb_clicked() //上一首 { int index=ui->listWidget->currentRow(); if(index==0) //如果在第一行 ui->listWidget->setCurrentRow(ui->listWidget->count()-1); else ui->listWidget->setCurrentRow(index-1); mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]); mediaplayer->play(); } void Widget::on_next_song_pb_clicked() //下一首 { int index=ui->listWidget->currentRow(); if(index == (ui->listWidget->count()-1)) //如果在最后一首歌 ui->listWidget->setCurrentRow(0); else ui->listWidget->setCurrentRow(index+1); mediaplayer->setMedia(playlist[ui->listWidget->currentRow()]); mediaplayer->play(); } void Widget::on_listWidget_doubleClicked(const QModelIndex &index) //雙擊播放指定音樂 { mediaplayer->setMedia(playlist[index.row()]); mediaplayer->play(); } void Widget::on_close_pb_clicked() //離開按鈕按下 { close(); } void Widget::on_about_pb_clicked() //關(guān)于按鈕按下 { QMessageBox::about(this,"關(guān)于","應(yīng)用:本地音樂播放器\r\n版本:1.0.0.0\r\n制作人:GrassFishStudio\r\n時間:2024年3月7日"); }
以上就是基于QT實現(xiàn)本地音樂播放器的詳細內(nèi)容,更多關(guān)于QT音樂播放器的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++基于boost asio實現(xiàn)sync tcp server通信流程詳解
這篇文章主要介紹了C++基于boost asio實現(xiàn)sync tcp server通信的流程,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07C語言實現(xiàn)Linux下的socket文件傳輸實例
這篇文章主要介紹了C語言實現(xiàn)Linux下的socket文件傳輸?shù)姆椒?較為詳細的分析了C語言文件Socket文件傳輸客戶端與服務(wù)器端相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2015-06-06