开发工具
Qt Creator
效果展示
思路方法
首先加入multimedia和multimediawidgets模块
定义一个播放器,和播放列表,
源代码
widget.h头文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include<QMediaPlayer>
#include<QMediaPlaylist>
#include<QFile>
#include<QFileDialog>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_btnAdd_clicked();
void on_btnMove_clicked();
void on_btnRemove_clicked();
void on_btnPlay_clicked();
void on_btnPause_clicked();
void on_btnStop_clicked();
void on_btnPrevious_clicked();
void on_btnNext_clicked();
void on_SliderVoice_valueChanged(int value);
void on_SliderTime_valueChanged(int value);
void on_listView_doubleClicked(const QModelIndex &index);
private slots:
void onStateChanged(QMediaPlayer::State state); //接受当前播放改变状态的
void onPlaylistChanged(int position); //当前文件播放列表变化
void onDurationChanged(qint64 duration); //当前总时长发生变化
void onPositionChanged(qint64 position); //每个文件发生变化,播放进度
private:
QMediaPlayer* player;//播放器
QMediaPlaylist* playlist;//播放列表
QString durationTime; //音频文件总时长
QString positionTime;//当前播放到位置
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
widget.cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle(tr("音乐播放器"));
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)));
}
Widget::~Widget()
{
delete ui;
}
//添加文件
void Widget::on_btnAdd_clicked()
{
QString strPath = QDir::homePath();
QString strTitle = "请选择文件";
//过滤器
QString file = "音频文件(*.mp3 *.wav *.wma);;mp3文件(*.mp3);;wav文件(*.wav);;所有文件(*.*)";
QStringList fileList = QFileDialog::getOpenFileNames(this,strTitle,strPath,file);
if(fileList.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->addItem(fileInfo.fileName());//将文件添加到列表中
}
if(player->state() == QMediaPlayer::PlayingState)//正在播放
{
playlist->setCurrentIndex(0);//从第一个开始播放
}
player->play();
}
void Widget::on_btnMove_clicked()
{
int pos = ui->listWidget->currentRow();
QListWidgetItem* item = ui->listWidget->takeItem(pos);
delete item;//从listWidget列表中华删除
if (playlist->currentIndex() == pos)
{
int npos = 0;
if (pos > 1)
npos = pos - 1;
playlist->removeMedia(pos);
if (ui->listWidget->count() > 0)
{
playlist->setCurrentIndex(npos);
onPlaylistChanged(npos);
}
else
{
player->stop();
ui->labName->setText("无曲目");
}
}
else
playlist->removeMedia(pos);
}
void Widget::on_btnRemove_clicked()
{
playlist->clear();
ui->listWidget->clear();
player->stop();
}
//播放
void Widget::on_btnPlay_clicked()
{
if(playlist->currentIndex()<0)
{
playlist->setCurrentIndex(0);
}
player->play();
}
//暂停
void Widget::on_btnPause_clicked()
{
player->pause();
}
//停止
void Widget::on_btnStop_clicked()
{
player->stop();
}
void Widget::on_btnPrevious_clicked()
{
playlist->previous();
}
void Widget::on_btnNext_clicked()
{
playlist->next();
}
void Widget::on_SliderVoice_valueChanged(int value)
{
player->setVolume(value);
}
void Widget::on_SliderTime_valueChanged(int value)
{
player->setPosition(value);
}
//双击列表
void Widget::on_listView_doubleClicked(const QModelIndex &index)
{
int nRow = index.row();//需要播放的文件索引
playlist->setCurrentIndex(nRow);
player->play();//播放
}
//播放器状态变化,更新按钮状态
void Widget::onStateChanged(QMediaPlayer::State state)
{
ui->btnPlay->setEnabled(!(state == QMediaPlayer::PlayingState));//开始按钮
ui->btnPause->setEnabled(state == QMediaPlayer::PlayingState);//暂停按钮禁用
ui->btnStop->setEnabled(state ==QMediaPlayer::PlayingState);//停止按钮禁用
}
//播放列表变化,更新当前播放文件名显示
void Widget::onPlaylistChanged(int position)
{
ui->listWidget->setCurrentRow(position);
QListWidgetItem *item = ui->listWidget->currentItem();
if(item)
{
ui->labName->setText(item->text());
}
}
//文件时长变化,更新进度显示
void Widget::onDurationChanged(qint64 duration)
{
ui->SliderTime->setMaximum(duration);//总共时长
int secs = duration/1000;
int mins = secs /60;//分钟
secs = secs % 60;//秒
durationTime = QString::asprintf("%d:%d",mins,secs);
ui->labTime->setText(positionTime+ "/"+duration);
}
//当前文件播放位置变化,更新进度显示
void Widget::onPositionChanged(qint64 position)
{
//如果正在拖动
if(ui->SliderTime->isSliderDown())
{
return;
}
ui->SliderTime->setSliderPosition(position);
int secs = position/1000;
int mins = secs /60;//分钟
secs = secs % 60;//秒
positionTime = QString::asprintf("%d:%d",mins,secs);
ui->labTime->setText(positionTime+ "/"+durationTime);
}
main.cpp
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}