效果图
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/056e3246e9af4ccdb768d647cadfd6a0.gif#pic_center)
知识点
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/1a1a733a5f6d4e599006a242ea2e0539.png)
.pro(环境QT6)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/cf1ff55ca9774b429a9f4ae7fcb6d77e.png)
.cpp
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/027fed29fc374dd6a433b425a03780a6.png)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
player = new QMediaPlayer(this);
QAudioOutput *audioOutput = new QAudioOutput(this);
player->setAudioOutput(audioOutput);
connect(player,&QMediaPlayer::positionChanged,
this, &MainWindow::do_positionChanged);
connect(player,&QMediaPlayer::durationChanged,
this, &MainWindow::do_durationChanged);
connect(player, &QMediaPlayer::sourceChanged,
this, &MainWindow::do_sourceChanged);
connect(player, &QMediaPlayer::playbackStateChanged,
this, &MainWindow::do_stateChanged);
connect(player, &QMediaPlayer::metaDataChanged,
this, &MainWindow::do_metaDataChanged);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::do_stateChanged(QMediaPlayer::PlaybackState state)
{
ui->btnPlay->setEnabled(state!=QMediaPlayer::PlayingState);
ui->btnPause->setEnabled(state==QMediaPlayer::PlayingState);
ui->btnStop->setEnabled(state==QMediaPlayer::PlayingState);
if (loopPlay && (state ==QMediaPlayer::StoppedState))
{
int count=ui->listWidget->count();
int curRow=ui->listWidget->currentRow();
curRow++;
curRow= curRow>=count? 0:curRow;
ui->listWidget->setCurrentRow(curRow);
player->play();
}
}
void MainWindow::do_sourceChanged(const QUrl &media)
{
ui->labCurMedia->setText(media.fileName());
}
void MainWindow::do_durationChanged(qint64 duration)
{
ui->sliderPosition->setMaximum(duration);
int secs=duration/1000;
int mins=secs/60;
secs=secs % 60;
durationTime=QString::asprintf("%d:%d",mins,secs);
ui->labRatio->setText(positionTime+"/"+durationTime);
}
void MainWindow::do_positionChanged(qint64 position)
{
if (ui->sliderPosition->isSliderDown())
return;
ui->sliderPosition->setSliderPosition(position);
int secs=position/1000;
int mins=secs/60;
secs=secs % 60;
positionTime=QString::asprintf("%d:%d",mins,secs);
ui->labRatio->setText(positionTime+"/"+durationTime);
}
void MainWindow::do_metaDataChanged()
{
QMediaMetaData metaData=player->metaData();
QVariant metaImg= metaData.value(QMediaMetaData::ThumbnailImage);
if (metaImg.isValid())
{
QImage img= metaImg.value<QImage>();
QPixmap musicPixmp= QPixmap::fromImage(img);
if (ui->scrollArea->width() <musicPixmp.width())
ui->labPic->setPixmap(musicPixmp.scaledToWidth(ui->scrollArea->width()-30));
else
ui->labPic->setPixmap(musicPixmp);
}
else
ui->labPic->clear();
}
QUrl MainWindow::getUrlFromItem(QListWidgetItem *item)
{
QVariant itemData= item->data(Qt::UserRole);
QUrl source =itemData.value<QUrl>();
return source;
}
void MainWindow::on_btnAdd_clicked()
{
QString curPath=QDir::homePath();
QString dlgTitle="选择音频文件";
QString filter="音频文件(*.mp3 *.wav *.wma);;所有文件(*.*)";
QStringList fileList=QFileDialog::getOpenFileNames(this,dlgTitle,curPath,filter);
if (fileList.count()<1)
return;
for (int i=0; i<fileList.size();i++)
{
QString aFile=fileList.at(i);
QFileInfo fileInfo(aFile);
QListWidgetItem *aItem =new QListWidgetItem(fileInfo.fileName());
aItem->setIcon(QIcon(":/images/images/musicFile.png"));
aItem->setData(Qt::UserRole, QUrl::fromLocalFile(aFile));
ui->listWidget->addItem(aItem);
}
if (player->playbackState() != QMediaPlayer::PlayingState)
{
ui->listWidget->setCurrentRow(0);
QUrl source= getUrlFromItem(ui->listWidget->currentItem());
player->setSource(source);
}
player->play();
}
void MainWindow::on_btnRemove_clicked()
{
int index =ui->listWidget->currentRow();
if (index>=0)
{
QListWidgetItem *item= ui->listWidget->takeItem(index);
delete item;
}
}
void MainWindow::on_btnClear_clicked()
{
loopPlay=false;
ui->listWidget->clear();
player->stop();
}
void MainWindow::on_btnPlay_clicked()
{
if (ui->listWidget->currentRow()<0)
ui->listWidget->setCurrentRow(0);
player->setSource(getUrlFromItem(ui->listWidget->currentItem()));
player->play();
loopPlay=ui->btnLoop->isChecked();
}
void MainWindow::on_btnPause_clicked()
{
player->pause();
}
void MainWindow::on_btnStop_clicked()
{
loopPlay=false;
player->stop();
}
void MainWindow::on_btnPrevious_clicked()
{
int curRow=ui->listWidget->currentRow();
curRow--;
curRow= curRow<0? 0:curRow;
ui->listWidget->setCurrentRow(curRow);
loopPlay=false;
player->setSource(getUrlFromItem(ui->listWidget->currentItem()));
player->play();
loopPlay=ui->btnLoop->isChecked();
}
void MainWindow::on_btnNext_clicked()
{
int count=ui->listWidget->count();
int curRow=ui->listWidget->currentRow();
curRow++;
curRow= curRow>=count? count-1:curRow;
ui->listWidget->setCurrentRow(curRow);
loopPlay=false;
player->setSource(getUrlFromItem(ui->listWidget->currentItem()));
player->play();
loopPlay=ui->btnLoop->isChecked();
}
void MainWindow::on_doubleSpinBox_valueChanged(double arg1)
{
player->setPlaybackRate(arg1);
}
void MainWindow::on_btnLoop_clicked(bool checked)
{
loopPlay=checked;
}
void MainWindow::on_btnSound_clicked()
{
bool mute=player->audioOutput()->isMuted();
player->audioOutput()->setMuted(!mute);
if (mute)
ui->btnSound->setIcon(QIcon(":/images/images/volumn.bmp"));
else
ui->btnSound->setIcon(QIcon(":/images/images/mute.bmp"));
}
void MainWindow::on_sliderVolumn_valueChanged(int value)
{
player->audioOutput()->setVolume(value/100.0);
}
void MainWindow::on_sliderPosition_valueChanged(int value)
{
player->setPosition(value);
}
.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtMultimedia>
#include <QListWidgetItem>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
private:
QMediaPlayer *player;
bool loopPlay=true;
QString durationTime;
QString positionTime;
QUrl getUrlFromItem(QListWidgetItem *item);
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow *ui;
private slots:
void do_stateChanged(QMediaPlayer::PlaybackState state);
void do_sourceChanged(const QUrl &media);
void do_durationChanged(qint64 duration);
void do_positionChanged(qint64 position);
void do_metaDataChanged();
void on_btnAdd_clicked();
void on_btnRemove_clicked();
void on_btnClear_clicked();
void on_btnPlay_clicked();
void on_btnPause_clicked();
void on_btnStop_clicked();
void on_btnPrevious_clicked();
void on_btnNext_clicked();
void on_doubleSpinBox_valueChanged(double arg1);
void on_btnLoop_clicked(bool checked);
void on_btnSound_clicked();
void on_sliderVolumn_valueChanged(int value);
void on_sliderPosition_valueChanged(int value);
};
#endif
ui界面
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fc65c5a8557b42968fc0939eb3438f82.png)