Qt 制作简易版音乐播放器

1. 界面设计:

2. 设置背景图片

// 1.重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    // 声明画家
    QPainter painter(this);
    QPixmap pix = QString(":/img/002.jpeg");
    // 设置图片伸缩
    pix.scaled(this->width(), this->height());
    // 贴背景图片
    painter.drawPixmap(0, 0, this->width(), this->height(), pix);
}

 3. 设置QlistWidget控件透明化

// 透明化 QListWidget 控件
ui->listWidget->setStyleSheet("background-color:transparent");

 4. 设置不规则按钮并贴图

    // 给按钮贴图片 设置图片不规则形状
    ui->btnUp->setStyleSheet("QPushButton{"
                             "border-image:url(:/img/01.png)}"
                             "QPushButton:pressed{"
                             "border-image:url(:/img/01_副本.png)}");
    ui->btnDown->setStyleSheet("QPushButton{"
                             "border-image:url(:/img/03.png)}"
                             "QPushButton:pressed{"
                             "border-image:url(:/img/03_副本.png)}");
    ui->btnStop->setStyleSheet("QPushButton{"
                             "border-image:url(:/img/04.png)}"
                             "QPushButton:pressed{"
                             "border-image:url(:/img/04_副本.png)}");
    ui->btnPlay->setStyleSheet("QPushButton{"
                             "border-image:url(:/img/05.png)}");
// btnPlay; btnStop; btnDown; btnUp 这四个按钮

 5. 遍历文件夹,将音乐文件设置到控件QlistWidget中去

// 2.读取文件 (遍历文件夹,设定文件格式)
void Widget::readFile()
{
    // 设置要遍历的目录
    this->str_pathmusic = "F:/C C++/Resource/Music";
    // 设置文件路径
    QDir dir(this->str_pathmusic);
    // 设置文件过滤器的格式
    QStringList nameFileters;
    // 设置文件格式
    nameFileters << "*mp3";
    // 将过滤后的文件名称 存在链表list中去
    QStringList files = dir.entryList(nameFileters, QDir::Files|QDir::Readable, QDir::Name);
    // 将遍历完之后的所有音乐文件设置到控件 QListWidget 中去
    ui->listWidget->addItems(files);
    // 设置将音乐列表的指针默认指向列表中的第一个
    this->p_item = ui->listWidget->item(0);
}

 

 6. 播放音乐

要加载播放音频模块

 

// 播放音乐
    QMediaPlayer * play = new QMediaPlayer;
    // 设置要播放的音乐文件
    play->setMedia(QUrl::fromLocalFile("F:/C C++/Resource/Music/不是花火呀-夏日晚风(片段).mp3"));
    // 设置声音大小
    play->setVolume(50);
    // 播放音乐
play->play();

7. QlistWidget 列表控件行发生改变时设置播放音乐条件

// QListWidget 控件行发生了改变 进行相应的处理
void Widget::on_listWidget_currentRowChanged(int currentRow)
{
    qDebug() << currentRow; // 获取行号
    qDebug() << ui->listWidget->item(currentRow)->text();   
    // 获取播放音乐名称
    this->str_musicFileName = ui->listWidget->item(currentRow)->text(); 
    // 实例化播放音乐对象
    this->p_play_music = new QMediaPlayer;
    // 设置要播放的音乐文件
    this->p_play_music->setMedia(QUrl::fromLocalFile(this->str_pathmusic) + '/' + this->str_musicFileName);
    // 停止播放音乐
    this->p_play_music->stop();
}

8. 点击上一曲 自动设置列表控件向上走一行

void Widget::on_btnUp_clicked()
{// 上一曲
    qDebug() << "上一曲";
    // 获取列表控件中的总行数
    int count = ui->listWidget->count();
    // 判断是否是默认第一行,将控件行号设置成总行数
    if(this->m_listWidgetRowNumber - 1 < 0)
    {
        this->m_listWidgetRowNumber = count;
    }
    // 设置列表控件槽函数中的行数-1
    on_listWidget_currentRowChanged(this->m_listWidgetRowNumber-1);
    // 当列表控件的行比总的行数小 当按下按钮时,跳转到上一行
    if(ui->listWidget->currentRow() < count)
    {
        // 列表控件中的行自动往上走一行
        ui->listWidget->setCurrentRow(this->m_listWidgetRowNumber);
        // 到达当前行为行底,将记录的行置成0
        if(count == this->m_listWidgetRowNumber-1)
        {
            this->m_listWidgetRowNumber = 0;
        }
    }
    // 将播放标记置成 true --> 播放音乐
    this->isPlay = true;
    // 调用播放槽函数
    on_btnPlay_clicked();
}
// btnUp 是按钮 转到槽函数的做法

9. 播放音乐

// 播放音乐
void Widget::on_btnPlay_clicked()
{
    // 播放音乐
    if(this->isPlay)
    {
        // 设置按钮图片
        ui->btnPlay->setStyleSheet("QPushButton{"
                                   "border-image:url(:/img/02.png)}"
                                   );
        // 将标记设置成false
        this->isPlay = false;
        // 播放音乐
        this->p_play_music->play();
    }
    else
    {
        // 将标记置成true
        this->isPlay = true;
        // 设置按钮图片
        ui->btnPlay->setStyleSheet("QPushButton{"
                                   "border-image:url(:/img/05.png)}"
                                   );
        // 暂停播放音乐
        this->p_play_music->stop();
    }
}
// btnPlay 是按钮 转到槽的做法

 10. 播放下一曲

// 下一曲
void Widget::on_btnDown_clicked()
{
    // 调用列表控件槽函数 行数+1
    on_listWidget_currentRowChanged(this->m_listWidgetRowNumber + 1);
    // 获取列表控件中的总行数
    int count = ui->listWidget->count();
    // 当控件列表中的行比总行小时
    if(ui->listWidget->currentRow() < count)
    {
        // 列表控件行自动向下走一行
        ui->listWidget->setCurrentRow(this->m_listWidgetRowNumber);
        // 当到达底行 将要向下走的行置成 -1
        if(count == this->m_listWidgetRowNumber+1)
        {
            this->m_listWidgetRowNumber = -1;
        }
    }
    // 将播放音乐置成true --> 播放音乐
    this->isPlay = true;
    // 调用播放音乐槽函数
    on_btnPlay_clicked();
}
// btnDown 是按钮 转到槽的做法

11. 停止播放音乐

// 停止播放音乐
void Widget::on_btnStop_clicked()
{
    // 停止播放音乐
    this->p_play_music->stop();
    // 将播放按钮复位(图片)
    ui->btnPlay->setStyleSheet("QPushButton{"
                               "border-image:url(:/img/05.png)}"
                               );
}
// btnStop 是按钮 转到槽的做法

12. 设置声音大小

// 设置声音大小
void Widget::on_horizontalSlider_sliderMoved(int position)
{
    // 记录声音大小
    this->m_playSetVolume = position;
    qDebug() << "音乐声音大小: " << position + 1;
    // 将控件中的position设置给播放音乐大小
    p_play_music->setVolume(position + 1);
    // 将positoin 设置给 标签声音
    ui->labelVolume->setText("音量:" + QString("%1").arg(position + 1) + "%");
}
// horizontalSlider 是控件 转到槽的做法

13. 完整代码

widght.h 头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QListWidgetItem>
#include <QMediaPlayer>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    // 1.重写绘图事件
    void paintEvent(QPaintEvent *event);

    // 2.读取文件 (遍历文件夹,设定文件格式)
    void readFile();

private:
    QString str_pathmusic;  // 文件路径目录
    QListWidgetItem * p_item;   // 音乐列表 指针
    QString str_musicFileName;  // 音乐文件名字
    QMediaPlayer * p_play_music;// 播放音乐对象
    int m_listWidgetRowNumber;  // 获取控件QListWidget 的行号
    bool isPlay = true;                // 是否播放音乐 true 是
    int m_playSetVolume;    // 设置声音大小

private slots:
    void on_listWidget_currentRowChanged(int currentRow);

    void on_btnUp_clicked();

    void on_btnPlay_clicked();

    void on_btnDown_clicked();

    void on_btnStop_clicked();

    void on_horizontalSlider_sliderMoved(int position);

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

 widget.cpp 文件

#include "widget.h"
#include "ui_widget.h"

#include <QPainter>
#include <QDebug>
#include <QDir>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    // 透明化 QListWidget 控件
    ui->listWidget->setStyleSheet("background-color:transparent");

    // 给按钮贴图片 设置图片不规则形状
    ui->btnUp->setStyleSheet("QPushButton{"
                             "border-image:url(:/img/01.png)}"
                             "QPushButton:pressed{"
                             "border-image:url(:/img/01_副本.png)}");
    ui->btnDown->setStyleSheet("QPushButton{"
                             "border-image:url(:/img/03.png)}"
                             "QPushButton:pressed{"
                             "border-image:url(:/img/03_副本.png)}");
    ui->btnStop->setStyleSheet("QPushButton{"
                             "border-image:url(:/img/04.png)}"
                             "QPushButton:pressed{"
                             "border-image:url(:/img/04_副本.png)}");
    ui->btnPlay->setStyleSheet("QPushButton{"
                             "border-image:url(:/img/05.png)}");

    // 调用读取文件函数
    readFile();
}

Widget::~Widget()
{
    delete ui;
}
// 1.重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    // 声明画家
    QPainter painter(this);
    QPixmap pix = QString(":/img/002.jpeg");
    // 设置图片伸缩
    pix.scaled(this->width(), this->height());
    // 贴背景图片
    painter.drawPixmap(0, 0, this->width(), this->height(), pix);
}

// 2.读取文件 (遍历文件夹,设定文件格式)
void Widget::readFile()
{
    // 设置要遍历的目录
    this->str_pathmusic = "F:/C C++/Resource/Music";
    // 设置文件路径
    QDir dir(this->str_pathmusic);
    // 设置文件过滤器的格式
    QStringList nameFileters;
    // 设置文件格式
    nameFileters << "*mp3";
    // 将过滤后的文件名称 存在链表list中去
    QStringList files = dir.entryList(nameFileters, QDir::Files|QDir::Readable, QDir::Name);
    // 将遍历完之后的所有音乐文件设置到控件 QListWidget 中去
    ui->listWidget->addItems(files);
    // 设置将音乐列表的指针默认指向列表中的第一个
    this->p_item = ui->listWidget->item(0);

    for(int i = 0; i < files.count(); i++)
         qDebug() << files.at(i);
}
// 3. QListWidget 控件行发生了改变 进行相应的处理
void Widget::on_listWidget_currentRowChanged(int currentRow)
{
    // 记录控件列表中的行数
    this->m_listWidgetRowNumber = currentRow;
    qDebug() << currentRow; // 获取行号
    qDebug() << ui->listWidget->item(currentRow)->text();   // 获取音乐文件名称
    // 获取播放音乐名称
    this->str_musicFileName = ui->listWidget->item(currentRow)->text();
    // 实例化播放音乐对象
    this->p_play_music = new QMediaPlayer;
    // 设置要播放的音乐文件
    this->p_play_music->setMedia(QUrl::fromLocalFile(this->str_pathmusic + '/' + this->str_musicFileName));
    // 设置播放音乐声音大小
    this->p_play_music->setVolume(1);
    // 停止播放音乐
    this->p_play_music->stop();
}


// 4. 上一曲
void Widget::on_btnUp_clicked()
{
    qDebug() << "上一曲";
    // 获取列表控件中的总行数
    int count = ui->listWidget->count();
    // 判断是否是默认第一行,将控件行号设置成总行数
    if(this->m_listWidgetRowNumber - 1 < 0)
    {
        this->m_listWidgetRowNumber = count;
    }
    // 设置列表控件槽函数中的行数-1
    on_listWidget_currentRowChanged(this->m_listWidgetRowNumber-1);
    // 当列表控件的行比总的行数小 当按下按钮时,跳转到上一行
    if(ui->listWidget->currentRow() < count)
    {
        // 列表控件中的行自动往上走一行
        ui->listWidget->setCurrentRow(this->m_listWidgetRowNumber);
        // 到达当前行为行底,将记录的行置成0
        if(count == this->m_listWidgetRowNumber-1)
        {
            this->m_listWidgetRowNumber = 0;
        }
    }
    // 设置播放音乐大小
    on_horizontalSlider_sliderMoved(this->m_playSetVolume);
    // 将播放标记置成 true --> 播放音乐
    this->isPlay = true;
    // 调用播放槽函数
    on_btnPlay_clicked();
}
// 5. 播放音乐
void Widget::on_btnPlay_clicked()
{
    // 播放音乐
    if(this->isPlay)
    {
        // 设置按钮图片
        ui->btnPlay->setStyleSheet("QPushButton{"
                                   "border-image:url(:/img/02.png)}"
                                   );
        // 将标记设置成false
        this->isPlay = false;
        // 播放音乐
        this->p_play_music->play();
    }
    else
    {
        // 将标记置成true
        this->isPlay = true;
        // 设置按钮图片
        ui->btnPlay->setStyleSheet("QPushButton{"
                                   "border-image:url(:/img/05.png)}"
                                   );
        // 暂停播放音乐
        this->p_play_music->stop();
    }
}
// 6. 下一曲
void Widget::on_btnDown_clicked()
{
    // 调用列表控件槽函数 行数+1
    on_listWidget_currentRowChanged(this->m_listWidgetRowNumber + 1);
    // 获取列表控件中的总行数
    int count = ui->listWidget->count();
    // 当控件列表中的行比总行小时
    if(ui->listWidget->currentRow() < count)
    {
        // 列表控件行自动向下走一行
        ui->listWidget->setCurrentRow(this->m_listWidgetRowNumber);
        // 当到达底行 将要向下走的行置成 -1
        if(count == this->m_listWidgetRowNumber+1)
        {
            this->m_listWidgetRowNumber = -1;
        }
    }
    // 设置播放音乐大小
    on_horizontalSlider_sliderMoved(this->m_playSetVolume);
    // 将播放音乐置成true --> 播放音乐
    this->isPlay = true;
    // 调用播放音乐槽函数
    on_btnPlay_clicked();
}
// 7. 停止播放音乐
void Widget::on_btnStop_clicked()
{
    // 停止播放音乐
    this->p_play_music->stop();
    // 将播放按钮复位(图片)
    ui->btnPlay->setStyleSheet("QPushButton{"
                               "border-image:url(:/img/05.png)}"
                               );
}
// 8. 设置声音大小
void Widget::on_horizontalSlider_sliderMoved(int position)
{
    // 记录声音大小
    this->m_playSetVolume = position;
    qDebug() << "音乐声音大小: " << position + 1;
    // 将控件中的position设置给播放音乐大小
    p_play_music->setVolume(position + 1);
    // 将positoin 设置给 标签声音
    ui->labelVolume->setText("音量:" + QString("%1").arg(position + 1) + "%");
}

 代码运行结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值