Qt项目(8)Qt实现音乐播放器

在这里插入图片描述

目标

制作一款音乐播放器,能够支持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论坛。
🎏欢迎点赞❤❤收藏⭐⭐打赏💴💴!
🎏欢迎评论区或私信指出错误❌,提出宝贵意见或疑问❓。


Qt是一款基于C++的跨平台应用开发框架,可以用来开发各种类型的应用程序,包括音乐播放器。下面我将用300字回答如何使用Qt纯代码实现音乐播放器。 首先,我们需要在Qt中创建一个新的项目。打开Qt Creator,选择创建项目,选择Qt Widgets应用模板。接下来,定义音乐播放器的界面,可以使用Qt提供的QWidget或QMainWindow类来实现。布局可以使用QVBoxLayout或其他布局管理器来安排。 然后,我们需要使用Qt的多媒体模块来实现音乐的播放功能。在代码中包含<QMediaPlayer>头文件,并创建一个QMediaPlayer对象。使用setMedia方法设置要播放的音乐文件,并调用play方法开始播放。可以通过调用pause、stop等方法来控制音乐的暂停和停止。 接下来,我们可以在界面上添加一些控制按钮,如播放、暂停、停止等。通过连接按钮的点击信号和槽函数,可以在用户点击按钮时触发相应的播放控制操作。例如,在播放按钮的槽函数中调用QMediaPlayer的play方法。 为了显示音乐播放进度和控制进度条等功能,可以使用QSlider或QProgressBar等控件。将其与QMediaPlayer的durationChanged和positionChanged信号连接,可以实时更新进度条的值。 另外,为了添加音乐列表功能,我们可以使用QListWidget或QTableView等控件来显示音乐文件的列表。通过调用addItem或setModel方法添加音乐文件,并在用户双击列表项时触发音乐播放。 最后,我们可以添加一些附加功能,如音量控制、音乐循环、随机播放等。这些可以通过调用QMediaPlayer的相应方法来实现。 综上所述,以上是使用Qt纯代码实现音乐播放器的基本步骤。通过利用Qt提供的丰富的控件和多媒体模块,我们可以很方便地开发出一个功能完善的音乐播放器应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGArea

原创不易,请多支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值