基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条
2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票!
我的投票地址:点击为我投票
1.实现音频文件对话框(QFileDialog类)
和其他应用程序一样,我们希望通过点击文件并打开文件对话框,选择要播放的音频文件,下面我们来实现它。
在ui界面拖一个按钮,并将其text改为添加音频,鼠标右击转到槽,选择clicked()并单击,在生成的槽函数中加入下列代码。
别忘了添加必要的头文件:#include<QFileDialog> 和 #include<QDir>
MainWindow.cpp
void MainWindow::on_pushButton_clicked()
{ QString curPash =QDir::currentPath(); QString dlgTitle="选择音频文件"; QString filter="音频文件(*.mp3 *.wav *.wma)mp3文件(*.mp3);;wav文件(*.wav);;wma文件(*.wma);;所有文件(*.*)"; QStringList fileList = QFileDialog::getOpenFileNames(this,dlgTitle,curPash,filter); if(fileList.count()<1) return; for(int i = 0;i<fileList.count();i++) { //ui->plainTextEdit->appendPlainText(fileList.at(i)); //将选择的文件显示在文本框上 }
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
知识点讲解:
-
QString curPash = QDir::currentPath();
获取应用程序当前的目录,也就是当前exe所在目录,可也自行设定。 -
QString dlgTitle=“选择音频文件”;
文件对话框的标题。 -
QString filter=“音频文件(.mp3 .wav .wma)mp3文件(.mp3);;wav文件(.wav);;wma文件(.wma);;所有文件(.)”;
用于设置文件过滤,每组文件之间用两个分号隔开,同一组内不同后缀之间用空格隔开。 -
getOpenFileNames( this, “Select one or more files to open”,"/home",“Images (*.png *.xpm *.jpg)”);
该函数用于选择打开多个文件,拥有4个参数,需要传递的是后三个参数,分别是对话框标题(dlgTitle),初始化目录(curPash )以及文件过滤器(filter)。返回值为选择文件的带路径的完整文件名,对应的getOpenFileName()函数用于选择并打开一个文件。选择多文件还是单文件,视具体情况而定。
利用创建QFileDialog文件框完成,效果如下:
2.实现音乐播放(QMediaPlayer类/QMediaPlaylist类)
首先在.h中定义播放器和播放列表,然后在.cpp中实现音乐播放。
别忘了在 .pro文件添加 QT += multimedia 注意QT全部大写,然后继续添加头文件
#include<QtMultimedia/QMediaPlayer> 和 #include<QtMultimedia/QMediaPlaylist>
MainWindow.h
//类中添加
class MainWindow : public QMainWindow
{ Q_OBJECT
private: QMediaPlayer * player; QMediaPlaylist * playlist;
private: Ui::MainWindow *ui;
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
MainWindow .cpp
//构造函数中添加 player = new QMediaPlayer(this); playlist = new QMediaPlaylist(this); playlist->setPlaybackMode(QMediaPlaylist::Loop);//设置循环模式 player->setPlaylist(playlist);//获取将播放列表要播放的文件
///
//添加音频文件 槽函数添加如下代码,上面出现的代码已省略 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()); //用于显示 //ui->plainTextEdit->appendPlainText(fileList.at(i)); //用于显示 } if(player->state()!=QMediaPlayer::PlayingState) { playlist->setCurrentIndex(0); } player->play();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
知识点讲解:
-
playlist->addMedia(QUrl::fromLocalFile(aFile));
通过循环,将文件添加到playlist播放器列表。 -
QFileInfo fileInfo(aFile);
获取文件的相关信息,例如文件名等等。 -
if(player->state()!=QMediaPlayer::PlayingState)
{
playlist->setCurrentIndex(0);
}
player->state()会返回当前播放器的状态,:PlayingState(值为1)为播放中状态,对应的还有StoppedState(值为0)空闲状态,PausedState(值为2)播放暂停状态。然后setCurrentIndex()用于设置当前播放列表的序号。 -
player->play();
-
播放音乐,对应的还有pause()暂停音乐,stop()关闭音乐。
3.实现进度条更新以及文件时长显示
在ui界面拖入Horizontal Bar进度条和tabel(显示文件时长)
添加相关定义和自定义的槽函数:
mainwindow.h
//类中添加
private:
QString durationTime;
QString positionTime;
private slots:
void onDurationChanged(qint64 duration); //文件时长变化,更新当前播放文件名显示
//播放文件数据总大小的信号, 它可以获得文件时间长度。
void onPositionChanged(qint64 position); //当前文件播放位置变化,更新进度显示
//播放到什么位置的信号, 参数是以毫秒来计算的。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
mainwindow.cpp
//构造函数中添加
//通过播放器发出的信号调用自定义槽函数 信号是播放器自动触发
connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(onPositionChanged(qint64)));
connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(onDurationChanged(qint64)));
//外面添加
void MainWindow::onDurationChanged(qint64 duration)
{ ui->horizontalSlider->setMaximum(duration); //设置进度条最大值 也就是歌曲时长 ms int secs = duration/1000; //全部秒数 int mins = secs/60;//分 secs = secs % 60;//秒 durationTime = QString::asprintf("%d:%d",mins,secs); ui->label->setText(positionTime+"/"+durationTime);
}
void MainWindow::onPositionChanged(qint64 position)
{ if(ui->horizontalSlider->isSliderDown()) return;//如果手动调整进度条,则不处理 ui->horizontalSlider->setSliderPosition(position); int secs = position/1000; int mins = secs/60; secs = secs % 60; positionTime = QString::asprintf("%d:%d",mins,secs); ui->label->setText(positionTime+"/"+durationTime);
}
void MainWindow::on_horizontalSlider_valueChanged(int value)
{ player->setPosition(value);//文件播放位置 根据进度条传入的参数
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
效果如下:
4.存在BUG
1.进度条每次移动一段,而不是匀速移动。
2.在音乐播放中发现存在卡顿情况,将进度条删除,则流畅运行,应该是单线程的问题,更新进度条导致了音乐播放期间的卡顿。
这次就更新到这里,下一期更新暂停,切换歌曲,声音以及移动窗口,还有最重要的修复BUG!!
文章来源: blog.csdn.net,作者:花狗Fdog,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Fdog_/article/details/107838053
- 点赞
- 收藏
- 关注作者
评论(0)