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) + "%");
}
代码运行结果: