Qt实战-------音乐播放器

开发工具

Qt Creator

效果展示

在这里插入图片描述

思路方法

首先加入multimedia和multimediawidgets模块
在这里插入图片描述
定义一个播放器,和播放列表,
在这里插入图片描述在这里插入图片描述

源代码

widget.h头文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include<QMediaPlayer>
#include<QMediaPlaylist>
#include<QFile>
#include<QFileDialog>
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();
private slots:
    void on_btnAdd_clicked();

    void on_btnMove_clicked();

    void on_btnRemove_clicked();

    void on_btnPlay_clicked();

    void on_btnPause_clicked();

    void on_btnStop_clicked();

    void on_btnPrevious_clicked();

    void on_btnNext_clicked();

    void on_SliderVoice_valueChanged(int value);

    void on_SliderTime_valueChanged(int value);

    void on_listView_doubleClicked(const QModelIndex &index);
private slots:
    void onStateChanged(QMediaPlayer::State state);   //接受当前播放改变状态的
    void onPlaylistChanged(int position);            //当前文件播放列表变化
    void onDurationChanged(qint64 duration);         //当前总时长发生变化
    void onPositionChanged(qint64 position);          //每个文件发生变化,播放进度
private:
    QMediaPlayer* player;//播放器
    QMediaPlaylist* playlist;//播放列表
    QString durationTime;     //音频文件总时长
    QString positionTime;//当前播放到位置

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

widget.cpp文件

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    this->setWindowTitle(tr("音乐播放器"));
    player = new QMediaPlayer(this);
    playlist = new QMediaPlaylist(this);
    playlist->setPlaybackMode(QMediaPlaylist::Loop);//设置循环播放
    player->setPlaylist(playlist);
    connect(player, SIGNAL(stateChanged(QMediaPlayer::State)), this, SLOT(onStateChanged(QMediaPlayer::State)));
    connect(player, SIGNAL(positionChanged(qint64)), this, SLOT(onPositionChanged(qint64)));
    connect(player, SIGNAL(durationChanged(qint64)), this, SLOT(onDurationChanged(qint64)));
    connect(playlist,SIGNAL(currentIndexChanged(int)),this,SLOT(onPlaylistChanged(int)));
}

Widget::~Widget()
{
    delete ui;
}
//添加文件
void Widget::on_btnAdd_clicked()
{
    QString strPath = QDir::homePath();
    QString strTitle = "请选择文件";
    //过滤器
    QString file = "音频文件(*.mp3 *.wav *.wma);;mp3文件(*.mp3);;wav文件(*.wav);;所有文件(*.*)";
    QStringList fileList = QFileDialog::getOpenFileNames(this,strTitle,strPath,file);
   if(fileList.count()<1)
   {
       return;
   }
   for(int i = 0;i < fileList.count();i++)
   {
       QString aFile = fileList.at(i);
       playlist->addMedia(QUrl::fromLocalFile(aFile));//添加本地文件
       QFileInfo fileInfo(aFile);
       ui->listWidget->addItem(fileInfo.fileName());//将文件添加到列表中
   }
   if(player->state() == QMediaPlayer::PlayingState)//正在播放
   {
       playlist->setCurrentIndex(0);//从第一个开始播放
   }
   player->play();
}

void Widget::on_btnMove_clicked()
{
    int pos = ui->listWidget->currentRow();
    QListWidgetItem* item = ui->listWidget->takeItem(pos);
    delete item;//从listWidget列表中华删除
    if (playlist->currentIndex() == pos)
    {
        int npos = 0;
        if (pos > 1)
            npos = pos - 1;
        playlist->removeMedia(pos);
        if (ui->listWidget->count() > 0)
        {
            playlist->setCurrentIndex(npos);
            onPlaylistChanged(npos);
        }
        else
        {
            player->stop();
            ui->labName->setText("无曲目");
        }
    }
    else
        playlist->removeMedia(pos);
}

void Widget::on_btnRemove_clicked()
{
    playlist->clear();
    ui->listWidget->clear();
    player->stop();
}
//播放
void Widget::on_btnPlay_clicked()
{
    if(playlist->currentIndex()<0)
    {
        playlist->setCurrentIndex(0);
    }
    player->play();
}
//暂停
void Widget::on_btnPause_clicked()
{
    player->pause();
}
//停止
void Widget::on_btnStop_clicked()
{
    player->stop();
}

void Widget::on_btnPrevious_clicked()
{
    playlist->previous();
}

void Widget::on_btnNext_clicked()
{
    playlist->next();
}

void Widget::on_SliderVoice_valueChanged(int value)
{
    player->setVolume(value);
}

void Widget::on_SliderTime_valueChanged(int value)
{
    player->setPosition(value);
}
//双击列表
void Widget::on_listView_doubleClicked(const QModelIndex &index)
{
    int nRow = index.row();//需要播放的文件索引
    playlist->setCurrentIndex(nRow);
    player->play();//播放
}
//播放器状态变化,更新按钮状态
void Widget::onStateChanged(QMediaPlayer::State state)
{
    ui->btnPlay->setEnabled(!(state == QMediaPlayer::PlayingState));//开始按钮
    ui->btnPause->setEnabled(state == QMediaPlayer::PlayingState);//暂停按钮禁用
    ui->btnStop->setEnabled(state ==QMediaPlayer::PlayingState);//停止按钮禁用
}
//播放列表变化,更新当前播放文件名显示
void Widget::onPlaylistChanged(int position)
{
    ui->listWidget->setCurrentRow(position);
    QListWidgetItem *item = ui->listWidget->currentItem();
    if(item)
    {
        ui->labName->setText(item->text());
    }
}
//文件时长变化,更新进度显示
void Widget::onDurationChanged(qint64 duration)
{
    ui->SliderTime->setMaximum(duration);//总共时长
    int secs = duration/1000;
    int mins = secs /60;//分钟
    secs = secs % 60;//秒
    durationTime = QString::asprintf("%d:%d",mins,secs);
    ui->labTime->setText(positionTime+ "/"+duration);
}
//当前文件播放位置变化,更新进度显示
void Widget::onPositionChanged(qint64 position)
{
    //如果正在拖动
    if(ui->SliderTime->isSliderDown())
    {
        return;
    }
    ui->SliderTime->setSliderPosition(position);
    int secs = position/1000;
    int mins = secs /60;//分钟
    secs = secs % 60;//秒
    positionTime = QString::asprintf("%d:%d",mins,secs);
    ui->labTime->setText(positionTime+ "/"+durationTime);
}

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}
  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

尘客-追梦

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值