参考 QMediaPlayer 类 |Qt 多媒体 5.15.18
QMediaPlaylist Class | Qt Multimedia 5.15.18
//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include<QFileDialog>
#include<QFileInfo>
#include<QMessageBox>
#include <QMainWindow>
#include<QMediaPlayer>
#include<QMediaPlaylist>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_btn_open_clicked();
void on_btn_play_clicked();
void on_btn_pause_clicked();
void on_btn_stop_clicked();
void on_btn_begin_clicked();
void on_btn_next_clicked();
void on_pushButton_7_clicked();
void on_horizontalSlider_valueChanged(int value);
void on_horizontalSlider_2_valueChanged(int value);
private:
Ui::MainWindow *ui;
QMediaPlayer *player;
QMediaPlaylist *playlist;
QString drtTime; // 歌曲时长
QString pstTime; // 播放位置
};
#endif // MAINWINDOW_H
//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
player=new QMediaPlayer(this);
playlist=new QMediaPlaylist(this);
player->setPlaylist(playlist);
//当歌曲到达末尾时进行循环播放
playlist->setPlaybackMode(QMediaPlaylist::Loop);
//QMediaPlayer的播放状态(如播放中、暂停、停止等)发生变化时
connect(player,&QMediaPlayer::stateChanged,this,[=](QMediaPlayer::State newState){
// 播放按钮:当播放器不在播放状态时启用
ui->btn_play->setDisabled(newState == QMediaPlayer::PlayingState);
// 暂停按钮:当播放器处于播放状态时启用
ui->btn_pause->setEnabled(newState == QMediaPlayer::PlayingState);
// 停止按钮:通常可以在任何状态下启用,但这里我们假设它也只在播放时启用(根据需要调整)
// 如果您希望在非播放状态下也能停止(比如从暂停状态),则应该移除下面的条件判断
ui->btn_stop->setEnabled(newState == QMediaPlayer::PlayingState || newState == QMediaPlayer::PausedState);
});
//播放歌曲当前位置、更新变化情况
connect(player,&QMediaPlayer::positionChanged,this,[=](qint64 pos ){
if(ui->horizontalSlider_2->isSliderDown())
{
return;
}
int sec = pos / 1000; // 秒
int min = sec / 60; // 分
sec = sec % 60; // 剩余的秒
//arg(min, 2, 10, QChar('0')) 2:这是字段宽度 10:这是10进制,'0':这是填充字符
pstTime = QString("%1:%2").arg(min, 2, 10, QChar('0')).arg(sec, 2, 10, QChar('0'));
ui->label_process->setText(pstTime + "/" + drtTime);
});
//当媒体内容的持续时间发生变化时,QMediaPlayer会发出这个信号。
//这通常发生在媒体文件被加载或媒体流的信息更新时
connect(player,&QMediaPlayer::durationChanged,this,[=](qint64 drt){
ui->horizontalSlider_2->setMaximum(drt);
int sec=drt/1000; // 秒
int min=sec/60; // 分
sec=sec%60; // 余数为秒
// drtTime=QString::asprintf("%d:%d",min,sec);
pstTime = QString("%1:%2").arg(min, 2, 10, QChar('0')).arg(sec, 2, 10, QChar('0'));
ui->label_process->setText(pstTime+"/"+drtTime);
});
connect(playlist,&QMediaPlaylist::currentIndexChanged,this,[=](int pos){
ui->listWidget->setCurrentRow(pos);
QListWidgetItem *item=ui->listWidget->currentItem();
if(item)
ui->label_songname->setText(item->text());
});
}
MainWindow::~MainWindow()
{
delete ui;
}
//打开文件
void MainWindow::on_btn_open_clicked()
{
// QString path=QDir::homePath();
// 设置文件过滤器,只显示音频文件
QStringList filters;
filters<< "*.mp3" << "*.wav" << "*.ogg" << "*.flac";
// 在Windows上,使用";;"作为多个过滤器之间的分隔符
// 在其他平台上(如Linux和macOS),通常使用单个";"
QString filter=filters.join(";;");
QStringList files =QFileDialog::getOpenFileNames(this,"Select one or more files to open","..",filter);
//选中0个返回
if(files.count()<1)
{
return;
}
for(QString path1:files)
{
QFileInfo info(path1);
//列表里添加元素
ui->listWidget->addItem(info.fileName());
playlist->addMedia(QMediaContent(QUrl::fromLocalFile(path1)));
}
if(player->state()!=QMediaPlayer::PlayingState)
{
playlist->setCurrentIndex(0);
}
player->play();
}
//播放
void MainWindow::on_btn_play_clicked()
{
if(playlist->currentIndex()<0)
playlist->setCurrentIndex(0);
player->play();
}
//暂停
void MainWindow::on_btn_pause_clicked()
{
player->pause();
}
//停止
void MainWindow::on_btn_stop_clicked()
{
player->stop();
}
//上一曲
void MainWindow::on_btn_begin_clicked()
{
playlist->previous();
}
//下一曲
void MainWindow::on_btn_next_clicked()
{
playlist->next();
}
//是否静音
void MainWindow::on_pushButton_7_clicked()
{
// 控制静音状态
bool mute=player->isMuted();
player->setMuted(!mute);
if(mute)
{
ui->pushButton_7->setIcon(QIcon(":/images/volumn.bmp"));
}
else
{
ui->pushButton_7->setIcon(QIcon(":/images/mute.bmp"));
}
}
//音量大小改变
void MainWindow::on_horizontalSlider_valueChanged(int value)
{
//设置音量大小
player->setVolume(value);
}
//改变歌曲进度
void MainWindow::on_horizontalSlider_2_valueChanged(int value)
{
//设置歌曲进度
player->setPosition(value);
}