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

// }
相关推荐
用户805533698035 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner5 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz10 天前
QML Hello World 入门示例
qt
xcyxiner13 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner13 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner14 天前
DicomViewer (添加模型类)3
qt
xcyxiner14 天前
DicomViewer (目录调整) 2
qt
xcyxiner14 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00616 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术16 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript