目标
制作一款音乐播放器,能够支持wav、mp3文件的播放,用户可以选择列表中的歌曲进行播放,有三个按钮对应播放/暂停,上一曲,下一曲。
1.实现步骤
- 1.准备素材,搭建界面
布局的时候为了美观可以给弹簧或者部件设置固定值。背景图网上随处可见,音乐素材可以去耳聆网去找,图标可以去阿里巴巴图标矢量库去找。需要注意的是,这个程序中,使用样式表的方法设置背景,那需要重写paintEvent()函数,否则将看不到背景图。重写代码如下:
void Widget::paintEvent(QPaintEvent *e)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
}
- 2.加载某一个固定的目录的音乐文件。使用QDir创建目录,配合QStringList创建文件过滤器,将文件名字全部添加到界面空间listWidget中。
- 3.创建播放器管理对象,即实例化QMediaPlayer,并进行必要的功能配置。
- 4.为界面上的按钮写对应的槽函数,实现对应功能。
2.源代码
main文件
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QStyleOption>
#include <QPainter>
#include <QDir>
#include <QListWidgetItem>
#include <QMediaPlayer>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
protected:
void paintEvent(QPaintEvent*);
private slots:
void on_lastBtn_clicked();
void on_startBtn_clicked();
void on_nextBtn_clicked();
private:
QString myDir;//获取音乐目录
QListWidgetItem *myItem;//音乐列表指针
QMediaPlayer *myPlayer;//播放器指针
bool isStart;//指示播放状态
int listNum;//列表总数
int currentIndex;//当前索引
private:
Ui::Widget *ui;
void Init();
void getDir();
void setPlayer();
};
#endif // WIDGET_H
.cpp文件
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
Init();
}
Widget::~Widget()
{
delete myItem;
delete ui;
}
void Widget::paintEvent(QPaintEvent *e)
{
//添加背景图的第一种方法,QSS中添加背景图,在此处重绘才可以显示
QStyleOption opt;
opt.init(this);
QPainter p(this);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
//添加背景图第二种方法
// QPainter painter(this);
// QPixmap pix(":/img/background.jpeg");
// pix.scaled(this->width(),this->height());
// painter.drawPixmap(0,0,this->width(),this->height(),pix);
}
void Widget::Init()
{
//初始配置和成员变量初始化
this->setWindowTitle("音乐播放器JC");
myDir.clear();
isStart=false;
myItem = new QListWidgetItem();
myPlayer=new QMediaPlayer(this);
listNum=0;
currentIndex=0;
getDir();
setPlayer();
}
void Widget::getDir()
{
//1.设置遍历路径
myDir = "E:/myCsdn/C12QMusicPlayer/myMusicPlayer/music";
QDir dir(myDir);
//2.设置文件过滤器
QStringList myFileters;
myFileters<<"*.wav" << "*.mp3";
//3.保存过滤后的文件名
QStringList fileList = dir.entryList(myFileters,QDir::Files|QDir::Readable,QDir::Name);
//4.添加到listwidget中
ui->listWidget->addItems(fileList);
ui->listWidget->sortItems();
listNum=ui->listWidget->count()-1;
myItem = ui->listWidget->item(0);
myItem->setSelected(true);
}
//设置播放器当前曲目
void Widget::setPlayer()
{
myPlayer->setMedia(QUrl::fromLocalFile(myDir+'/'+ui->listWidget->item(currentIndex)->text()));
myPlayer->setVolume(30);//设置音量
myPlayer->pause();
}
//上一曲 暂停当前曲目,判断边界,播放器指向上一首,准备播放
void Widget::on_lastBtn_clicked()
{
if(currentIndex==0){
currentIndex=listNum;
}
else{
currentIndex--;
}
setPlayer();
if(!isStart){//当前未播放
myItem = ui->listWidget->item(currentIndex);
myItem->setSelected(true);
}
else{//当前正在播放
myPlayer->stop();
myPlayer->play();
myItem = ui->listWidget->item(currentIndex);
myItem->setSelected(true);
}
}
//播放 暂停:切换图标,并且执行暂停/播放操作
void Widget::on_startBtn_clicked()
{
if(isStart){
isStart=false;
ui->startBtn->setStyleSheet("QPushButton#startBtn{border-image: url(:/img/start.png);background:transparent;}");
myPlayer->pause();
}
else{
isStart=true;
ui->startBtn->setStyleSheet("QPushButton#startBtn{border-image: url(:/img/stop.png);background:transparent;}");
myPlayer->play();
}
}
//下一曲:暂停当前曲目,判断边界,播放器指向下一首,准备播放
void Widget::on_nextBtn_clicked()
{
if(currentIndex==listNum){
currentIndex=0;
}
else{
currentIndex++;
}
setPlayer();
if(!isStart){
myItem = ui->listWidget->item(currentIndex);
myItem->setSelected(true);//设置选中
}
else{
myPlayer->stop();
myPlayer->play();
myItem = ui->listWidget->item(currentIndex);
myItem->setSelected(true);
}
}
3.总结与思考
总结:
1.代码中提供了两种设置窗体背景的方法,使用样式表的方法时,对应的样式表的代码如下:
background-image: url(:/img/background.jpeg);//改为自己的路径即可
2.设置按钮的图标,在我的文章中,之前都是使用setIcon,本次使用设置样式表的方式。
3.使用QDir获取某一路径下文件的方式应该注意和学习,同时使用文件过滤器的方法也应掌握。
4.使用QMediaPlayer播放音乐文件的方法第一次出现,同时要注意使用这个类,应在.pro文件中添加QT += multimedia。
拓展
这个小项目只实现了基础功能,搭建了一个基础的平台,可以在此基础上从实用角度和技术角度完善,包括了:
1.可以添加Vertical Slider或者Dial控件调整音量;
2.QMediaPlayer有关于进度的信号作为接口,实现播放进度条。
3.QMediaPlayer切换不同播放状态(stop,playing,pasue)时会发出信号,可以根据这些信号丰富一下界面。
4.可以在listWidget中加上鼠标点击事件,例如双击播放。
5.可以实现拖拽进入执行播放的功能。
6.使用QLabel显示正在播放的文件名。
7.使用按钮可以刷新”目录中的内容“或者导入某些文件。
8.QMediaPlayer的setMedia方法可以播放网络歌曲,将Url设置为网络地址即可。
4.传送门
END |
🎏文章原创,首发于CSDN论坛。
🎏欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🎏欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。