Qt简单音乐播放器

本文介绍了一个使用Qt库开发的简易音乐播放器实现过程。该播放器支持多种播放模式,如顺序播放、随机播放和循环播放,并具备基本的播放、暂停、上一首、下一首等功能。此外,还实现了音量调节、进度调节以及从文件夹加载音乐文件的能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMediaPlayer>
#include <QDir>
#include <QListWidgetItem>
namespace Ui {
    class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
    void updateDir(QString fileName);

private slots:
    void OnMetaDataAvailableChanged(bool available);

    void OnPositionChanged(qint64 value);

    void OnStateChanged(QMediaPlayer::State value);

    void on_btnStart_clicked();

    void on_sldVolume_sliderMoved(int value);

    void on_sldReal_sliderMoved(int position);

    void on_btnOpenDir_clicked();

    void on_btnPrev_clicked();

    void on_btnNext_clicked();

    void on_btnOpenFile_clicked();

    void on_btnVolume_clicked();

    void on_listWidget_itemDoubleClicked(QListWidgetItem *item);

private:
    Ui::Widget *ui;
    QMediaPlayer *mediaPlayer; // 多媒体对象变量声明
    QDir *dir;//文件
    int index;
    int stoped;
    int prevVolume;
};

#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QTime>
#include <QFileDialog>
#include <QListWidgetItem>
#include <QtGlobal>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->stoped = 0;
    this->index = 0;
    //实例化文件
    this->dir = new QDir();
    //实例化媒体
    this->mediaPlayer = new QMediaPlayer(this);
    this->ui->btnVolume->setText("");
    this->ui->btnVolume->setIcon(this->style()->standardIcon(QStyle::SP_MediaVolume));
    this->ui->sldVolume->setRange(0, 100);
    this->ui->sldVolume->setValue(50);
    this->prevVolume = this->ui->sldVolume->value();
    this->mediaPlayer->setVolume(this->ui->sldVolume->value());//设置音量
    // 设置是否启动滑块追踪:true 表示启动追踪;false 表示禁用追踪;
    // 如果启用了滑块追踪,则滑块在拖动过程中会一直触发 valueChanged 信号;
    // 如果禁用了滑块追踪,则滑块在拖动过程中不会触发 valueChanged 信号,
    // 只有在用户释放滑块时,才触发 valueChanged 信号。
    this->ui->sldReal->setTracking(false);
    this->ui->sldVolume->setTracking(false);
    //信号链接槽函数
    //元数据改变
    connect(this->mediaPlayer, SIGNAL(metaDataAvailableChanged(bool)), this, SLOT(OnMetaDataAvailableChanged(bool)));
    //进度改变
    connect(this->mediaPlayer, SIGNAL(positionChanged(qint64)), this, SLOT(OnPositionChanged(qint64)));
    //状态改变
    connect(this->mediaPlayer, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(OnStateChanged(QMediaPlayer::State)));
    //默认路径
    updateDir(R"(..\Music)");
}

Widget::~Widget()
{
    delete ui;
}
void Widget::updateDir(QString filePath)
{
    //设置路径
    this->dir->setPath(filePath);
    this->ui->listWidget->clear();
    this->index = 0;
    QStringList namelist;
    namelist << "*.mp3";
    if (!this->dir->exists())
    {
        return;
    }
    this->dir->setFilter(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot); //文件 不要.和..
    this->dir->setSorting(QDir::DirsFirst);//文件夹排在前面
    QFileInfoList list = this->dir->entryInfoList(namelist);
    for (int i = 0; i < list.size(); ++i)
    {
        QListWidgetItem *item = nullptr;
        if (list.at(i).isFile())
        {
            item = new QListWidgetItem(this->ui->listWidget);
            item->setText(list.at(i).fileName());
            item->setIcon(QIcon(this->style()->standardIcon(QStyle::SP_FileIcon)));//标准图标
        }
        if (item != nullptr)
        {
            this->ui->listWidget->addItem(item);
        }
    }
    if (this->ui->listWidget->count() > 0)
    {
        QString fileName = this->dir->absolutePath() + R"(/)" + this->ui->listWidget->item(this->index)->text();
        this->stoped = 1;
        this->mediaPlayer->setMedia(QUrl::fromLocalFile(fileName));
        this->stoped = 0;
        this->ui->labSongName->setText(this->ui->listWidget->item(this->index)->text());
        this->setWindowTitle(this->ui->labSongName->text() + " - Qt音乐播放器");
    }
    else
    {
        this->stoped = 1;
        this->mediaPlayer->setMedia(QUrl::fromLocalFile(" "));
        this->stoped = 0;
        this->ui->labSongName->setText("未知");
        this->setWindowTitle(this->ui->labSongName->text() + " - Qt音乐播放器");
    }
}

void Widget::OnMetaDataAvailableChanged(bool available)
{
    qDebug() << "OnMetaDataAvailableChanged";
    if (available)
    {
        qDebug() << "OnMetaDataAvailableChangedBool";
        int time = this->mediaPlayer->metaData("Duration").toInt();
        this->ui->labTotalTime->setText(QTime(0, 0, 0).addMSecs(time).toString("hh:mm:ss"));
        this->ui->sldReal->setRange(0, time);//设置进度范围条
//        this->ui->labSongName->setText(this->mediaPlayer->metaData("Title").toString() + ".mp3");
    }
}

void Widget::OnPositionChanged(qint64 value)
{
    qDebug() << "OnPositionChanged";
    this->ui->labRealTime->setText(QTime(0, 0, 0).addMSecs(int(value)).toString("hh:mm:ss"));
    this->ui->sldReal->setValue(int(value));
}

void Widget::OnStateChanged(QMediaPlayer::State value)
{
    qDebug() << "OnStateChanged";
    if (QMediaPlayer::PlayingState == value)
    {
        qDebug() << "OnStateChanged播放";
        this->ui->btnStart->setText("暂停");
    }
    else if (QMediaPlayer::PausedState == value)
    {
        qDebug() << "OnStateChanged暂停";
        this->ui->btnStart->setText("播放");
    }
    else if (QMediaPlayer::StoppedState == value)
    {
        qDebug() << "OnStateChanged结束";
        qDebug() << this->stoped ;
        this->ui->btnStart->setText("播放");
        if (0 == this->stoped)
        {
            if ("顺序播放" == this->ui->cbxSelectMode->currentText())
            {
                qDebug() << "顺序播放";
                this->on_btnNext_clicked();
            }
            else if ("随机播放" == this->ui->cbxSelectMode->currentText())
            {
                qDebug() << "随机播放";
                if (ui->listWidget->count() != 1)
                {
                    //设置随机数种子
                    qsrand(uint(QTime(0, 0, 0).secsTo(QTime::currentTime())));
                    while (1)
                    {
                        int rand = qrand() % this->ui->listWidget->count();
                        if (rand != this->index)
                        {
                            this->index = rand;
                            break;
                        }
                    }
                    QString fileName = this->dir->absolutePath() + R"(/)" + this->ui->listWidget->item(this->index)->text();
                    this->stoped = 1;
                    this->mediaPlayer->setMedia(QUrl::fromLocalFile(fileName));
                    this->stoped = 0;
                    this->ui->labSongName->setText(this->ui->listWidget->item(this->index)->text());
                    this->setWindowTitle(this->ui->labSongName->text() + " - Qt音乐播放器");
                }
                else
                {
                    this->on_btnNext_clicked();
                }
            }
            else if ("循环播放" == this->ui->cbxSelectMode->currentText())
            {
                qDebug() << "循环播放";
                //啥也不做
            }
            this->mediaPlayer->play();
        }
    }
}
void Widget::on_btnStart_clicked()
{
    qDebug() << "on_btnStart_clicked";
    if (this->ui->btnStart->text() == "播放")
    {
        this->mediaPlayer->play();//开始播放
    }
    else if (this->ui->btnStart->text() == "暂停")
    {
        this->mediaPlayer->pause();//暂停播放
    }
}
//音量调节
void Widget::on_sldVolume_sliderMoved(int value)
{
    qDebug() << "on_sldVolume_sliderMoved";
    this->prevVolume = value;
    this->mediaPlayer->setVolume(value);//设置音量
    if (0 == value)
    {
        this->ui->btnVolume->setIcon(this->style()->standardIcon(QStyle::SP_MediaVolumeMuted));
    }
    else
    {
        this->ui->btnVolume->setIcon(this->style()->standardIcon(QStyle::SP_MediaVolume));
    }
}
//进度调节
void Widget::on_sldReal_sliderMoved(int position)
{
    qDebug() << "on_sldReal_sliderMoved";
    this->mediaPlayer->setPosition(position);//设置位置
}
//打开文件夹
void Widget::on_btnOpenDir_clicked()
{
    qDebug() << "on_btnOpenDir_clicked";
    QString tmpPath = QFileDialog::getExistingDirectory();
    if (tmpPath == nullptr)
    {
        return;
    }
    updateDir(tmpPath);
}
//上一首
void Widget::on_btnPrev_clicked()
{
    qDebug() << "on_btnPrev_clicked";
    this->stoped = 1;
    //上一首
    --this->index;
    if (this->index < 0)
    {
        this->index = this->ui->listWidget->count() - 1;
    }
    //上一首名字
    QString fileName = this->dir->absolutePath() + R"(/)" + this->ui->listWidget->item(this->index)->text();
    //当前状态
    if (this->mediaPlayer->state() == QMediaPlayer::PlayingState)
    {
        this->stoped = 1;
        this->mediaPlayer->setMedia(QUrl::fromLocalFile(fileName));
        this->stoped = 0;
        this->ui->labSongName->setText(this->ui->listWidget->item(this->index)->text());
        this->setWindowTitle(this->ui->labSongName->text() + " - Qt音乐播放器");
        this->mediaPlayer->play();//保持播放状态
        return;
    }
    this->stoped = 1;
    this->mediaPlayer->setMedia(QUrl::fromLocalFile(fileName));
    this->stoped = 0;
    this->ui->labSongName->setText(this->ui->listWidget->item(this->index)->text());
    this->setWindowTitle(this->ui->labSongName->text() + " - Qt音乐播放器");
}
//下一首
void Widget::on_btnNext_clicked()
{
    qDebug() << "on_btnNext_clicked";
    //下一首
    ++this->index;
    if (this->index == this->ui->listWidget->count())
    {
        this->index = 0;
    }
    //下一首名字
    QString fileName = this->dir->absolutePath() + R"(/)" + this->ui->listWidget->item(this->index)->text();
    //当前状态
    if (this->mediaPlayer->state() == QMediaPlayer::PlayingState)
    {
        this->stoped = 1;
        this->mediaPlayer->setMedia(QUrl::fromLocalFile(fileName));
        this->stoped = 0;
        this->ui->labSongName->setText(this->ui->listWidget->item(this->index)->text());
        this->setWindowTitle(this->ui->labSongName->text() + " - Qt音乐播放器");
        this->mediaPlayer->play();//保持播放状态
        return;
    }
    this->stoped = 1;
    this->mediaPlayer->setMedia(QUrl::fromLocalFile(fileName));
    this->stoped = 0;
    this->ui->labSongName->setText(this->ui->listWidget->item(this->index)->text());
    this->setWindowTitle(this->ui->labSongName->text() + " - Qt音乐播放器");
}
//打开文件
void Widget::on_btnOpenFile_clicked()
{
    qDebug() << "on_btnOpenDir_clicked";
    QString arg("MP3 (*.mp3)");
    QString fileNamePath = QFileDialog::getOpenFileName(this, "选择歌曲", R"(..\Music)", "MP3 (*.mp3)", &arg);
    if (fileNamePath == nullptr)
    {
        return;
    }
    this->ui->listWidget->clear();
    this->index = 0;
    QFileInfo fileInfo(fileNamePath);
    QListWidgetItem *item =  new QListWidgetItem(this->ui->listWidget);
    item->setText(fileInfo.fileName());
    this->dir->setPath(R"(..\Music)");
    item->setIcon(QIcon(this->style()->standardIcon(QStyle::SP_FileIcon)));//标准图标
    if (item != nullptr)
    {
        this->ui->listWidget->addItem(item);
    }
    if (this->ui->listWidget->count() > 0)
    {
        this->stoped = 1;
        this->mediaPlayer->setMedia(QUrl::fromLocalFile(fileNamePath));
        this->stoped = 0;
        this->ui->labSongName->setText(this->ui->listWidget->item(this->index)->text());
        this->setWindowTitle(this->ui->labSongName->text() + " - Qt音乐播放器");
    }
    else
    {
        this->stoped = 1;
        this->mediaPlayer->setMedia(QUrl::fromLocalFile(" "));
        this->stoped = 0;
        this->ui->labSongName->setText("未知");
        this->setWindowTitle(this->ui->labSongName->text() + " - Qt音乐播放器");
    }
}

void Widget::on_btnVolume_clicked()
{
    qDebug() << "on_btnVolume_clicked";
    if (this->ui->sldVolume->value() != 0)
    {
        this->ui->btnVolume->setIcon(this->style()->standardIcon(QStyle::SP_MediaVolumeMuted));
        this->ui->sldVolume->setValue(0);
        this->mediaPlayer->setVolume(0);
    }
    else
    {
        this->ui->btnVolume->setIcon(this->style()->standardIcon(QStyle::SP_MediaVolume));
        this->ui->sldVolume->setValue(this->prevVolume);
        this->mediaPlayer->setVolume(this->prevVolume);
    }
}

void Widget::on_listWidget_itemDoubleClicked(QListWidgetItem *item)
{
    qDebug() << "on_listWidget_itemDoubleClicked";
    for (int i = 0; i < this->ui->listWidget->count(); ++i)
    {
        if (item->text() == this->ui->listWidget->item(i)->text())
        {
            this->index = i;
        }
    }
    //选定的名字
    QString fileName = this->dir->absolutePath() + R"(/)" + this->ui->listWidget->item(this->index)->text();
    //当前状态
    if (this->mediaPlayer->state() == QMediaPlayer::PlayingState)
    {
        this->stoped = 1;
        this->mediaPlayer->setMedia(QUrl::fromLocalFile(fileName));
        this->stoped = 0;
        this->ui->labSongName->setText(this->ui->listWidget->item(this->index)->text());
        this->setWindowTitle(this->ui->labSongName->text() + " - Qt音乐播放器");
        this->mediaPlayer->play();//保持播放状态
        return;
    }
    this->stoped = 1;
    this->mediaPlayer->setMedia(QUrl::fromLocalFile(fileName));
    this->stoped = 0;
    this->ui->labSongName->setText(this->ui->listWidget->item(this->index)->text());
    this->setWindowTitle(this->ui->labSongName->text() + " - Qt音乐播放器");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值