qt小项目,简单的音乐播放器

问题: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) //背景添加
// {

// }
相关推荐
曹牧6 分钟前
Java:实现List的定长截取
java·开发语言·list
Lxinccode9 分钟前
python(42) : 监听本地文件夹上传到服务器指定目录
服务器·开发语言·python·文件上传服务器·监听文件上传服务器
木头左28 分钟前
Python实现ETF网格自动化交易集成动量阈值判断
开发语言·自动化
CodeCraft Studio32 分钟前
全球知名的Java Web开发平台Vaadin上线慧都网
java·开发语言·前端·vaadin·java开发框架·java全栈开发·java ui 框架
静水流深-刘申34 分钟前
算法继续刷起-2025年09月26日
开发语言·c++·算法
平平无奇。。。1 小时前
C++11之异常
开发语言·c++·visual studio
木头左1 小时前
跨周期共振效应在ETF网格参数适配中的应用技巧
开发语言·python·算法
almighty271 小时前
C# WPF实现ComboBox实时搜索与数据绑定
开发语言·c#·wpf·combobox
菜鸟小九1 小时前
SSM(MybatisPlus)
java·开发语言·spring boot·后端
数据知道2 小时前
Go基础:常用数学函数处理(主要是math包rand包的处理)
开发语言·后端·golang·go语言