QT开发中文网

QT实现一个简单的MP3播放器

更多完整QT视频资料、文档视频、学习路线图等领取q君羊:487707667

QMediaPlayer 一个播放器的好东西,这个例子非常简单,可以对mp3 、 mp4 、 wmv文件进行播放,MP3的功能还是比较简单的,下面一起看看这个mp3的功能吧:

运行的界面:

img

此例子结合了添加文件,删除文件,清空列表,下一曲,上一曲,暂停,stop,音量的控制,运行条的控制。实现MP3的基本功能模块。

下面来看下页面的布局吧:

img

界面布局非常简单,下面我们来看看代码吧:

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

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(); //后一个文件}

更多完整QT视频资料、文档视频、学习路线图等领取q君羊:487707667

版权声明:本文为weixin_42126427原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_42126427/article/details/106622208

目录导航
      • 更多完整QT视频资料、文档视频、学习路线图等领取q君羊:487707667
  • 添加文件:
  • 移除文件:
  • 清空列表:
  • QMEDIAPLAYLIST 类的常用函数:
        • 更多完整QT视频资料、文档视频、学习路线图等领取q君羊:487707667
  • 本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
    转载请注明出处:https://qt.0voice.com/?id=1260

    分享:
    扫描分享到社交APP
    上一篇
    下一篇
    发表列表
    游客 游客
    此处应有掌声~
    评论列表

    还没有评论,快来说点什么吧~

    联系我们

    在线咨询: 点击这里给我发消息

    微信号:3007537140

    上班时间: 10:30-22:30

    关注我们
    x

    注册

    已经有帐号?