问题:ui界面文件的spacer效果不是我所想的,可能还不太熟练spacer的使用,所以固定了窗口大小
可改进点:没有添加播放器背景,可在paintevent重载,自行添加想要背景
主要所使用的知识:qt文件对话框和qfile的使用,qt媒体的配置和使用,qurl的使用
注意事项:记得在.pro文件添加多媒体模块,负责无法使用媒体播放器
.h文件
cpp
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QDebug>
#include <QFileDialog>
#include <QDir>
#include <QMediaPlayer>
#include <QAudioOutput>
#include <QUrl>
#include <QString>
#include <QPainter>
QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private slots:
void on_pushButton_clicked();
void on_pushButton_6_clicked();
void on_pushButton_3_clicked();
void on_pushButton_4_clicked();
void on_listWidget_doubleClicked(const QModelIndex &index);
void loadMusicFromDirectory(const QString& directoryPath);
void on_pushButton_7_clicked();
// protected:
// void paintEvent(QPaintEvent* event) override;
private:
Ui::Widget *ui;
const QString windowTitle = "musicPlayer2025";
bool isVoiceSliderVisible = false;
QList<QUrl> playList;
QAudioOutput* audioOutput;
QMediaPlayer* mediaPlayer;
int curPlayIndex = 0;
};
#endif // WIDGET_H
.cpp文件
cpp
#include "widget.h"
#include "ui_widget.h"
#define defaultVolume 0.5
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
this->setWindowTitle(windowTitle);
//固定窗口大小,不知为什么ui界面里的spacer有问题
this->setFixedSize(709,709);
//使voiceSlider隐藏,如果需要显示点击即可
ui->voiceSlider->setVisible(isVoiceSliderVisible);
// 播放音乐,先加载模块multimedia
audioOutput = new QAudioOutput(this);
mediaPlayer = new QMediaPlayer(this);
mediaPlayer->setAudioOutput(audioOutput);
// 设置默认音量为 50%(即音量为 0.5)
audioOutput->setVolume(defaultVolume);
ui->voiceSlider->setRange(0, 100);
ui->voiceSlider->setValue(defaultVolume * 100);
// 获取当前媒体的时长
connect(mediaPlayer, &QMediaPlayer::durationChanged, this, [=](qint64 duration) {
ui->totallabel->setText(QString("%1:%2").arg(duration / 1000 / 60, 2, 10, QChar('0')).arg(duration / 1000 % 60));
// 显示播放时长
ui->playCourseSlider->setRange(0, duration);
});
//获取当前媒体音量
// 获取当前播放时长
connect(mediaPlayer, &QMediaPlayer::positionChanged, this, [=](qint64 pos) {
ui->curlabel->setText(QString("%1:%2").arg(pos / 1000 / 60, 2, 10, QChar('0')).arg(pos / 1000 % 60));
// 显示播放时长
ui->playCourseSlider->setValue(pos);
});
// 拖到滑块让播放进度改变
connect(ui->playCourseSlider, &QSlider::sliderMoved, mediaPlayer, &QMediaPlayer::setPosition);
// 拖动音量滑块调整播放音量
connect(ui->voiceSlider, &QSlider::valueChanged, this, [=](int value) {
// 将滑块的值映射到音量范围 [0.0, 1.0]
qreal volume = value / 100.0;
audioOutput->setVolume(volume);
});
// 默认加载音乐目录并更新播放列表
loadMusicFromDirectory("C:/Users/20834/Music/");
}
Widget::~Widget()
{
delete ui;
}
void Widget::loadMusicFromDirectory(const QString& directoryPath)
{
qInfo() << tr("打开音乐所在目录");
// 打开指定目录
auto path = directoryPath;
// 根据这个路径获取音乐文件
QDir dir(path);
auto musicList = dir.entryList(QStringList() << "*.mp3" << "*.wav");
// 输出音乐列表
if (musicList.isEmpty())
{
qInfo() << tr("未获取相关音乐文件");
}
else
{
qInfo() << musicList;
}
ui->listWidget->clear(); // 清空现有列表
ui->listWidget->addItems(musicList);
// 默认选中第一个音乐
if (!musicList.isEmpty())
ui->listWidget->setCurrentRow(0);
// 把音乐完整路径保存起来
playList.clear(); // 清空已有列表,避免重复添加
for (auto file : musicList)
{
playList.append(QUrl::fromLocalFile(path + "/" + file));
}
qInfo() << playList;
}
void Widget::on_pushButton_clicked()//选取音乐所在的目录
{
// 你可以保留此方法用于用户手动选择其他目录
qInfo() << tr("打开音乐所在目录");
// 打开目录
auto path = QFileDialog::getExistingDirectory(this, tr("请选择音乐所在的目录"), "C:/Users/20834/Music/");
qInfo() << path;
loadMusicFromDirectory(path);
}
void Widget::on_pushButton_6_clicked()//播放或暂停按钮的配置
{
if(playList.empty())
return;
switch(mediaPlayer->playbackState())
{
case QMediaPlayer::PlaybackState::StoppedState:
{
// 播放当前选中的音乐
curPlayIndex = ui->listWidget->currentRow(); // 获取选中的行数
// 检查索引是否有效
if (curPlayIndex >= 0 && curPlayIndex < playList.size())
{
mediaPlayer->setSource(playList[curPlayIndex]);
mediaPlayer->play();
}
else
{
qWarning() << tr("无效的选项,无法播放音乐");
}
break;
}
case QMediaPlayer::PlaybackState::PlayingState:
{
mediaPlayer->pause();
break;
}
case QMediaPlayer::PlaybackState::PausedState:
{
mediaPlayer->play();
break;
}
}
}
void Widget::on_pushButton_3_clicked() // 上一曲
{
curPlayIndex--;
if(curPlayIndex <= 0)
{
curPlayIndex = playList.size() - 1;
}
ui->listWidget->setCurrentRow(curPlayIndex);
mediaPlayer->setSource(playList[curPlayIndex]);
mediaPlayer->play();
}
void Widget::on_pushButton_4_clicked() // 下一曲
{
curPlayIndex++;
if(curPlayIndex >= playList.size())
{
curPlayIndex = 0;
}
ui->listWidget->setCurrentRow(curPlayIndex);
mediaPlayer->setSource(playList[curPlayIndex]);
mediaPlayer->play();
}
void Widget::on_listWidget_doubleClicked(const QModelIndex &index)//双击列表歌曲播放
{
curPlayIndex = index.row();
mediaPlayer->setSource(playList[curPlayIndex]);
mediaPlayer->play();
}
void Widget::on_pushButton_7_clicked()//音量调节
{
isVoiceSliderVisible = !isVoiceSliderVisible;
ui->voiceSlider->setVisible(isVoiceSliderVisible);
}
// void Widget::paintEvent(QPaintEvent* event) //背景添加
// {
// }