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
喜歡的朋友可以關注我的博客,一起加油。