admin管理员组

文章数量:1130349


文章目录

  • 目标
  • 1.实现步骤
  • 2.源代码
  • 3.总结与思考
  • 4.传送门

目标

制作一款音乐播放器,能够支持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.传送门

  • 🎄我的主页
  • 🎄【QT实战】汇总导航
  • 🎄上一篇:Qt项目(7)Qt实现网页浏览器
  • 🎄下一篇:Qt项目(9)Qt+MPlayer实现视频播放器
END

🎏文章原创,首发于CSDN论坛。
🎏欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🎏欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。



文章目录

  • 目标
  • 1.实现步骤
  • 2.源代码
  • 3.总结与思考
  • 4.传送门

目标

制作一款音乐播放器,能够支持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.传送门

  • 🎄我的主页
  • 🎄【QT实战】汇总导航
  • 🎄上一篇:Qt项目(7)Qt实现网页浏览器
  • 🎄下一篇:Qt项目(9)Qt+MPlayer实现视频播放器
END

🎏文章原创,首发于CSDN论坛。
🎏欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🎏欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。


本文标签: 播放器项目音乐QT