QT实现简单的音乐播放器

音乐播放器

实现效果

在这里插入图片描述

代码

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QHBoxLayout>//水平布局
#include <QVBoxLayout>//垂直布局
#include <QVideoWidget>
#include <QMediaPlayer>
#include <QPushButton>
#include <QSlider> //进度条
#include <QComboBox>
#include <QListWidget> //显示所有歌曲
#include <QLabel>
#include <QTimer>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
public slots:
    void openFile();//打开并选择文件
    void playSong();//暂停/播放
    void doubleClickPlay(QListWidgetItem *item);//双击选歌
    void setTimeSlider(qint64 duration); //设置进度条范围
    void updateTimeSlider(qint64 position); //进度条变化
    void updateTime_NameShow();//显示名字及时间变化
    void updateSingPos(int positoin);//更新歌曲进度条
    void updateVolume(int positoin);//更新音量
    void pre();//上一首
    void next();//下一首
private:
    Ui::Widget *ui;
    QMediaPlayer *mediaPlayer; //媒体播放
    QVBoxLayout *vbox; //整体的垂直布局
    QHBoxLayout *hbox1;//按钮水平布局
    QHBoxLayout *hbox2;//标签水平布局
    QHBoxLayout *hbox3;//进度条水平布局
    QPushButton *openBtn; //打开文件
    QPushButton *upBtn; //上一首
    QPushButton *downBtn;//下一首
    QPushButton *playBtn;//播放/暂停
    QComboBox *comboBox;//存放播放顺序 //下拉框
    QSlider *volumeSlider;//进度条
    QSlider *timeSlider;
    QListWidget *listWidget; //显示所有文件的窗口
    QLabel *label; //显示播放时间/总时间
    QLabel *labName;

    int n;
    QString singName;
    QTimer *timer;
    QStringList nameList; //存放所有的文件,依靠下标寻找位置
    int index;//下标
};

#endif // WIDGET_H

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QTime>
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    //先进行布局
    //先实例化两种布局
    this->vbox = new QVBoxLayout(this); //垂直布局
    this->setLayout(this->vbox);//设置整个窗口为垂直布局
    this->hbox1 = new QHBoxLayout(this); //按钮层水平布局
    this->hbox2 = new QHBoxLayout(this);//标签层水平布局
    this->hbox3 = new QHBoxLayout(this);//进度条布局
    //实例化对象、从上到下依次为媒体播放、listWidget、label、进度条、各种按钮
    this->mediaPlayer = new QMediaPlayer(this);

    this->listWidget = new QListWidget(this); //创建结构简单的列表


    this->label = new QLabel("00:00/00:00",this); //标签栏
    this->labName = new QLabel("暂无音乐",this);

    this->volumeSlider = new QSlider(this);//进度条
    this->volumeSlider->setMaximumWidth(200);
    this->timeSlider = new QSlider(this);

    this->comboBox = new QComboBox(this);
    this->comboBox->addItem("顺序播放");
    this->comboBox->addItem("随机播放");
    this->comboBox->addItem("循环播放");

    //设置成水平的
    this->volumeSlider->setOrientation(Qt::Horizontal);
    this->timeSlider->setOrientation(Qt::Horizontal);
    this->volumeSlider->setMinimumWidth(100);
    this->volumeSlider->setRange(0,100);
    this->volumeSlider->setValue(50);

    this->openBtn = new QPushButton("打开",this);
    this->upBtn = new QPushButton("上一首",this);
    this->downBtn = new QPushButton("下一首",this);
    this->playBtn = new QPushButton("播放",this);
    this->playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPlay));

    this->timer = new QTimer(this);
    this->n = 0;
    this->index = 0;
    //给水平布局增加控件
    hbox1->addWidget(this->openBtn);
    hbox1->addWidget(this->upBtn);
    hbox1->addWidget(this->downBtn);
    hbox1->addWidget(this->playBtn);
    hbox1->addWidget(this->comboBox);

    hbox2->addWidget(this->label);
    hbox2->addWidget(this->labName);

    hbox3->addWidget(this->timeSlider);
    hbox3->addWidget(this->volumeSlider);
    //垂直布局
    vbox->addWidget(this->listWidget);
    vbox->addLayout(this->hbox2);
    vbox->addLayout(this->hbox3);
    vbox->addLayout(this->hbox1);
    connect(this->openBtn,SIGNAL(clicked()),this,SLOT(openFile()));
    connect(this->playBtn,SIGNAL(clicked()),this,SLOT(playSong()));
    connect(this->mediaPlayer,SIGNAL(positionChanged(qint64)),this,SLOT(updateTimeSlider(qint64))); //进度条变化
    connect(this->mediaPlayer,SIGNAL(durationChanged(qint64)),this,SLOT(setTimeSlider(qint64)));
    connect(this->timer,SIGNAL(timeout()),this,SLOT(updateTime_NameShow())); //滚动显示名字、显示歌曲已播放时间/总时间
    connect(this->timeSlider,SIGNAL(sliderMoved(int)),this,SLOT(updateSingPos(int)));
    connect(this->volumeSlider,SIGNAL(sliderMoved(int)),this,SLOT(updateVolume(int)));
    connect(this->listWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(doubleClickPlay(QListWidgetItem*)));//双击播放
    connect(this->upBtn,SIGNAL(clicked()),this,SLOT(pre()));
    connect(this->downBtn,SIGNAL(clicked()),this,SLOT(next()));

}

Widget::~Widget()
{
    delete ui;
}
//打开文件,并显示到listWidget
void Widget::openFile()
{
    /*
    1、选择歌曲
    2、设置媒体
    3、显示歌曲名称
    4、设置音量
    5、开始播放
    */
    //QString fileName = QFileDialog::getOpenFileName(this,"select",".","MP3(*.mp3)");
//    if(fileName == "")
//    {
//        return;
//    }
//    this->mediaPlayer->setMedia(QUrl(fileName));//设置媒体源
//    QFileInfo info(fileName);//获取文件全部信息
//    this->singName = info.fileName();
//    this->labName->setText(this->singName);
    this->nameList.clear();
    this->listWidget->clear();//清空表单
    this->nameList = QFileDialog::getOpenFileNames(this,"select",".","MP3(*.mp3)");
    for(int i = 0;i < nameList.size();i++)  //循环的将选中的文件加入到listWidget
    {
        QFileInfo info(nameList.at(i));
        QListWidgetItem *item = new QListWidgetItem(info.fileName(),this->listWidget);
        this->listWidget->addItem(item);
        item->setToolTip(nameList.at(i));//----------
    }

    QString fileName = nameList.at(0);
    this->mediaPlayer->setMedia(QUrl(fileName));//设置媒体源
    QFileInfo info(fileName);//获取文件全部信息
    this->singName = info.fileName();
    this->labName->setText(this->singName);
    this->mediaPlayer->setVolume(50);//设置音量
    this->mediaPlayer->play();
    this->timer->start(1000);
    this->playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPause));
}

void Widget::playSong()
{
    /*
    判断歌曲状态,正在播放/暂停
    */
    int state = this->mediaPlayer->state();
    if(state == QMediaPlayer::PlayingState)
    {
        //正在播放,暂停播放,图标修改成播放
        this->mediaPlayer->pause();
        this->playBtn->setText("播放");
        this->playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPlay));

    }
    else if (state == QMediaPlayer::PausedState) {
        //暂停,继续播放,图标修改为暂停
        this->mediaPlayer->play();
        this->playBtn->setText("暂停");
        this->playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPause));
    }
}

void Widget::doubleClickPlay(QListWidgetItem *item)//参数为双击的目标信息
{
    /*
     * 1、获取listWidget中下标位置
    2、设置媒体源、播放选中的歌曲
    3、修改名字
    4、修改图标
    5、定时器启动
    */
    this->index = this->listWidget->currentRow(); //获取当前下标
    this->mediaPlayer->setMedia(QUrl(item->toolTip()));
    this->labName->setText(item->text());
    this->mediaPlayer->play();
    this->timer->start(1000);
    this->playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPause));
}

//给进度条设置范围
void Widget::setTimeSlider(qint64 duration)
{
    this->timeSlider->setRange(0,int(duration));
}
//根据歌曲播放的位置修改进度条
void Widget::updateTimeSlider(qint64 position)
{
    this->timeSlider->setValue(int(position));
}

//滚动显示名字、修改文本时间
//实现播放模式
void Widget::updateTime_NameShow()
{
    /*
    根据n的值显示内容
    */
    this->n++;
    if(this->n == this->singName.size())
    {
        this->n = 0;
    }
    this->labName->setText(this->singName.mid(this->n));//滚动显示
    //获取总时间跟当前播放时长
    qint64 dur = this->mediaPlayer->duration();
    qint64 pos = this->mediaPlayer->position();
    //实例化两个对象,用来显示
    QTime durTime(0,0,0);
    QTime posTime(0,0,0);
    this->label->setText(posTime.addMSecs(int(pos)).toString("mm:ss") + "/" + durTime.addMSecs(int(dur)).toString("mm:ss"));

    //根据播放模式进行播放
    /*
     * 1、顺序播放,下标++,最后一首的时候,下标置为0(dur == pos的时候歌曲结束)
     * 2、随机播放,qrand()给下标一个随机值
     * 3、循环播放,下表不变
    */
    if(dur == pos)
    {
        if(this->comboBox->currentText() == "顺序播放")
        {
            this->index++;
            if(this->index > this->nameList.size() - 1)
            {
                this->index = 0;
            }
        }
        else if (this->comboBox->currentText() == "随机播放") {
            this->index = qrand() % this->nameList.size();
        }
        else {
            this->index = this->index;
        }
        //开始播放
        QFileInfo fileName(this->nameList.at(this->index));//获取文件信息
        this->mediaPlayer->setMedia(QUrl(this->nameList.at(this->index)));//设置媒体源
        this->labName->setText(fileName.fileName());//修改标题
        this->mediaPlayer->play();
        this->timer->start(1000);
    }


}
//修改歌曲播放的位置
void Widget::updateSingPos(int positoin)
{
    this->mediaPlayer->setPosition(positoin);
}
//修改音量
void Widget::updateVolume(int positoin)
{
    this->mediaPlayer->setVolume(positoin);
}

void Widget::pre()
{
    /*
     * 1、下标--,判断--后下标的值,如果<0,则播放最后一首
     * 2、暂停之前播放的歌曲
     * 3、获取要播放歌曲的信息
     * 4、播放歌曲,设置歌名等
    */
    this->index--;
    if(this->index < 0)
    {
        this->index = this->nameList.size() - 1;
    }
    this->mediaPlayer->stop();
    QFileInfo fileName(this->nameList.at(this->index));//获取文件信息
    this->mediaPlayer->setMedia(QUrl(this->nameList.at(this->index)));//设置媒体源
    this->labName->setText(fileName.fileName());//修改标题
    this->mediaPlayer->play();
    this->timer->start(1000);
}

void Widget::next()
{
    /*
     * 1、下标++,判断++后下标的值,如果>最大歌曲数,则播放第一首
     * 2、暂停之前播放的歌曲
     * 3、获取要播放歌曲的信息
     * 4、播放歌曲,设置歌名等
    */
    this->index++;
    if(this->index > this->nameList.size() - 1)
    {
        this->index = 0;
    }
    this->mediaPlayer->stop();
    QFileInfo fileName(this->nameList.at(this->index));//获取文件信息
    this->mediaPlayer->setMedia(QUrl(this->nameList.at(this->index)));//设置媒体源
    this->labName->setText(fileName.fileName());//修改标题
    this->mediaPlayer->play();
    this->timer->start(1000);
}

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt实现一个MPlayer音乐播放器,你可以按照以下步骤进行操作: 1. 首先,确保你已经安装了MPlayer。你可以在命令行中运行`mplayer`来检查它是否已经安装并可用。 2. 创建一个新的Qt项目,使用Qt Creator或者命令行工具。 3. 在Qt项目中,使用`QProcess`类来调用MPlayer命令行工具。`QProcess`类允许你在后台运行外部程序并与其通信。 4. 在你的Qt代码中,创建一个`QProcess`对象,并使用`start()`函数来启动MPlayer进程。 ```cpp QProcess* mplayerProcess = new QProcess(this); mplayerProcess->start("mplayer", QStringList() << "your_music_file.mp3"); ``` 这将启动MPlayer进程并播放指定的音乐文件。 5. 如果你需要控制MPlayer的播放,你可以使用`write()`函数向MPlayer发送命令。例如,你可以发送"pause"命令来暂停音乐的播放。 ```cpp mplayerProcess->write("pause\n"); ``` 这将向MPlayer发送"pause"命令。 6. 你还可以使用`readAllStandardOutput()`函数来读取MPlayer的输出。这对于获取当前播放时间、音量等信息非常有用。 ```cpp QByteArray output = mplayerProcess->readAllStandardOutput(); // 解析output中的信息 ``` 7. 最后,记得在你的Qt应用程序退出时终止MPlayer进程,以确保资源的正确释放。 ```cpp mplayerProcess->terminate(); mplayerProcess->waitForFinished(); ``` 这是一个简单的示例来演示如何在Qt实现一个基本的MPlayer音乐播放器。你可以根据自己的需求进行扩展和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值