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

发布于:2025-03-10 ⋅ 阅读:(14) ⋅ 点赞:(0)

问题:ui界面文件的spacer效果不是我所想的,可能还不太熟练spacer的使用,所以固定了窗口大小
可改进点:没有添加播放器背景,可在paintevent重载,自行添加想要背景
主要所使用的知识:qt文件对话框和qfile的使用,qt媒体的配置和使用,qurl的使用
注意事项:记得在.pro文件添加多媒体模块,负责无法使用媒体播放器
.h文件

#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文件

#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) //背景添加
// {

// }