qt實現一個簡單的mp3播放器(有資源例子)

         QMediaPlayer  一個播放器的好東西,這個例子非常簡單,可以對mp3 、 mp4 、 wmv文件進行播放,MP3的功能還是比較簡單的,下面一起看看這個mp3的功能吧:

運行的界面:

     此例子結合了添加文件,刪除文件,清空列表,下一曲,上一曲,暫停,stop,音量的控制,運行條的控制。實現MP3的基本功能模塊。

    下面來看下頁面的佈局吧:

界面佈局非常簡單,下面我們來看看代碼吧:

首先要在你的工程文件中加上:

QT	+= multimedia

這樣你纔可去寫對應的東西 

對應的頭文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMediaPlayer>
#include <QMediaPlaylist>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    //自定義槽函數
    void onStateChanged(QMediaPlayer::State state);

    void onPlaylistChanged(int position);

    void onDurationChanged(qint64 duration);
    void onPositionChanged(qint64 position);


    void on_btnAdd_3_clicked();

    void on_btnRemove_3_clicked();

    void on_btnClear_3_clicked();


    void on_listWidget_2_doubleClicked(const QModelIndex &index);

    void on_sliderVolumn_2_valueChanged(int value);

    void on_btnSound_2_clicked();

    void on_btnPlay_2_clicked();

    void on_btnPause_2_clicked();

    void on_btnStop_2_clicked();

    void on_sliderPosition_2_valueChanged(int value);

    void on_btnPrevious_2_clicked();

    void on_btnNext_2_clicked();

private:
    QMediaPlayer *player; //播放器
    QMediaPlaylist *playList; //播放列表

    QString durationTime;//總長度
    QString  positionTime;//當前播放到位置.

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

 對應的cpp文件詳細說明:

主函數的初始化:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    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)));

}

解析:

      onStateChanged()在播放器播放狀態變化時發射 ,以更新界面上的“播放”“ 暫停” “ 停止”按鈕的便能狀態。

      onPlaylistChanged()。在播放列表的當前文件變化時發射,用以更新界面上顯示當前媒體文件名。

      onDurationChanged () 在文件時長變化時發射,用 於更新界面上文件時間長度的顯示。

      onPositionChanged()  在當前文件播放位置變化時發射,用於更新界面上的播放進度顯示。

 

對應的4個函數:

void MainWindow::onStateChanged(QMediaPlayer::State state)
{
   //播放器狀態變化,更新按鈕狀態
    ui->btnPlay_2->setEnabled(!(state == QMediaPlayer::PlayingState));
    ui->btnPause_2->setEnabled(state == QMediaPlayer::PlayingState);
    ui->btnStop_2->setEnabled(state == QMediaPlayer::PlayingState);
}

void MainWindow::onPlaylistChanged(int position)
{
    //播放列表變化,更新當前播放文件名顯示
    ui->listWidget_2->setCurrentRow(position);
    QListWidgetItem *item = ui->listWidget_2->currentItem();
    if(item)
    {
        ui->LabCurMedia_2->setText(item->text()); //顯示當前的的音樂
    }
}

void MainWindow::onDurationChanged(qint64 duration)
{
   //文件時長變化,更新進度顯示
    ui->sliderPosition_2->setMaximum(duration);

    int secs =int (duration/1000); //秒
    int mins =secs / 60; //分鐘
    secs=secs % 60;//餘數秒
    durationTime = QString::asprintf("%d:%d",mins,secs);
    ui->LabRatio_2->setText(positionTime+"/"+durationTime);
}

void MainWindow::onPositionChanged(qint64 position)
{
   //當前文件播放位置變化,更新進度顯示
    if (ui->sliderPosition_2->isSliderDown())
        return;

    ui->sliderPosition_2->setSliderPosition(position);
    int secs =int (position/1000); //秒
    int mins =secs / 60; //分鐘
    secs=secs % 60;//餘數秒
    durationTime = QString::asprintf("%d:%d",mins,secs);
    ui->LabRatio_2->setText(positionTime+"/"+durationTime);
}

 

下面是播放列表的控制:

添加文件:

void MainWindow::on_btnAdd_3_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(filter.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_2->addItem(fileInfo.fileName());//添加到界面文件列表
    }

    if(player->state()!= QMediaPlayer::PlayingState)
    {
        playList->setCurrentIndex(0);
    }
    player->play();
}

移除文件:

void MainWindow::on_btnRemove_3_clicked()
{
    //移除一個文件
    int pos = ui->listWidget_2->currentRow(); //獲取當前選中的行
    QListWidgetItem *item = ui->listWidget_2->takeItem(pos);
    delete item;

    if(playList->currentIndex()==pos)  //當刪除的是當前播放的音樂
    {
        int nextPos=0;
        if (pos>=1)
            nextPos=pos-1;
        playList->removeMedia(pos);
        if(ui->listWidget_2->count() > 0)
        {
            playList->setCurrentIndex(nextPos);
            onPlaylistChanged(nextPos);
        }
        else
        {
            player->stop();
            ui->LabCurMedia_2->setText("無曲目");
        }
    }
    else
    {
        playList->removeMedia(pos);
    }
}

清空列表:

void MainWindow::on_btnClear_3_clicked()
{
    //清空列表
    playList->clear();
    ui->listWidget_2->clear();
    player->stop();
}

QMediaPlaylist 類的常用函數:
 

addMedia()函數添加一個文件;

removeMedia()移除一個文件;

setCurrentlndex ()設置當前播放文件序號;

clear()清空播放列 表。

 在界面上的 listWidget 裏雙擊一個條目時, 切換到播放這個文件:

void MainWindow::on_listWidget_2_doubleClicked(const QModelIndex &index)
{
    int rowNo = index.row(); //獲取當前行
    playList->setCurrentIndex(rowNo); //選擇當前雙擊的位置
    player->play();
}

播放、 暫停或停止播放器 , 只需調用 QMediaPlayer 相應函數即可

void MainWindow::on_btnPlay_clicked()
{//播放
    if (playlist->currentIndex()<0)
        playlist->setCurrentIndex(0);
    player->play();
}

void MainWindow::on_btnPause_clicked()
{//暫停播放
    player->pause();
}

void MainWindow::on_btnStop_clicked()
{//停止播放
    player->stop();
}

播放狀態變化時會發射 stateChanged()信號, 在關聯的自定義槽函數 onStateChanged()裏執行的函數:

void MainWindow::on_sliderVolumn_valueChanged(int value)
{//調整音量
    player->setVolume(value);
}

void MainWindow::on_btnSound_clicked()
{//靜音控制
    bool mute=player->isMuted();
    player->setMuted(!mute);
    if (mute)
        ui->btnSound->setIcon(QIcon(":/images/images/volumn.bmp"));
    else
        ui->btnSound->setIcon(QIcon(":/images/images/mute.bmp"));
}


控制進度:

void MainWindow::on_sliderPosition_2_valueChanged(int value)
{
    //文件進度調控
    player->setPosition(value);
}


上一曲,下一曲:

void MainWindow::on_btnPrevious_2_clicked()
{
    //前一文件
    playList->previous();//前一個
}

void MainWindow::on_btnNext_2_clicked()
{
    //下一文件
    playList->next(); //後一個文件
}

 

差不多這樣的一個小功能:

鏈接:https://pan.baidu.com/s/1ovZnbg_Te3gb5Np5_unL5w 
提取碼:4m9o

 

喜歡的朋友可以關注我的博客,一起加油。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章