当前位置: 首页 > news >正文

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

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

// }


相关文章:

  • PyTorch深度学习框架60天进阶学习计划第13天:模型保存与部署
  • CogView: 基于Transformer的通用领域文本到图像生成
  • 国产编辑器EverEdit - 设置文件类型关联为EverEdit
  • 智慧菜场系统(源码+文档+讲解+演示)
  • 文档操作方法得合理使用
  • python 海龟作图 从爱心到旋转爱心
  • 专题二找到字符串中所有字母异位词
  • RuleOS:区块链开发的“新引擎”,点燃Web3创新之火
  • 【初探数据结构】链表OJ算法——快慢指针
  • 算法随打:拼写单词
  • 某Oracle RAC数据库存储配置
  • Windows Docker Desktop 设置中文
  • C++ 继承
  • 【音视频】ffmpeg命令提取像素格式
  • 基于掩码自编码器的可扩展视觉学习者
  • hadoop框架与核心组件刨析(二)HDFS
  • 【我的待办(MyTodolists)-免费无内购的 IOS 应用】
  • ldap和nexus3.75版本相结合之后admin默认走ladp了没有设置权限了
  • Vue 3 组件库持续集成 (CI) 实战:GitHub Actions 自动化测试与 Storybook 文档构建 - 构建高效可靠的组件库 CI 流程
  • leetcode日记(80)复原IP地址
  • 电脑自带的做网站叫什么软件/怎样自己制作网站
  • 洞口网站建设/网站广告策划
  • 建设企业网站电话是多少/正规网站建设服务
  • 网站建设嘉兴公司电话/青岛seo建站
  • 网站建设方式/nba最新比赛直播
  • 网站的想法/aso安卓优化公司