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

// }
相关推荐
GISer_Jing21 分钟前
Three.js中AR实现详解并详细介绍基于图像标记模式AR生成的详细步骤
开发语言·javascript·ar
委婉待续24 分钟前
Qt的学习(一)
开发语言·qt·学习
笨笨马甲24 分钟前
Qt Quick Layout功能及架构
开发语言·qt
Dovis(誓平步青云)33 分钟前
探索C++标准模板库(STL):String接口的底层实现(下篇)
开发语言·c++·stl·string
海棠一号37 分钟前
JAVA理论第五章-JVM
java·开发语言·jvm
草莓熊Lotso1 小时前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
海的诗篇_1 小时前
前端开发面试题总结-JavaScript篇(二)
开发语言·前端·javascript·typescript
feiyangqingyun1 小时前
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
c++·qt·udp·gb28181
cccc来财2 小时前
Go中的协程并发和并发panic处理
开发语言·后端·golang
狐凄2 小时前
Python实例题:Python计算线性代数
开发语言·python·线性代数