基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条

基于Qt的音乐播放器(一)添加音频文件,播放音乐,更新进度条实现音频文件对话框(QFileDialog类)getOpenFileNames(this,”Selectoneormorefilestoopen”,”/home”,”Images(*.png*.xpm*.jpg)”);实现音乐播放(QMediaPlayer类/QMediaPlaylist类)实现进度条更新以及文件时长显示

大家好,又见面了,我是你们的朋友全栈君。

2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票!
我的投票地址:点击为我投票
在这里插入图片描述



完整项目已上传GitHub,需要自行下载

1.实现音频文件对话框(QFileDialog类)

和其他应用程序一样,我们希望通过点击文件并打开文件对话框,选择要播放的音频文件,下面我们来实现它。

在ui界面拖一个按钮,并将其text改为添加音频,鼠标右击转到槽,选择clicked()并单击,在生成的槽函数中加入下列代码。

别忘了添加必要的头文件:#include<QFileDialog> 和 #include<QDir>

MainWindow.cpp

void MainWindow::on_pushButton_clicked()
{ 
   
   QString curPash =QDir::currentPath();
   QString dlgTitle="选择音频文件";
   QString filter="音频文件(*.mp3 *.wav *.wma)mp3文件(*.mp3);;wav文件(*.wav);;wma文件(*.wma);;所有文件(*.*)";
   QStringList fileList = QFileDialog::getOpenFileNames(this,dlgTitle,curPash,filter);
   if(fileList.count()<1)
       return;
   for(int i = 0;i<fileList.count();i++)
   { 
   
       //ui->plainTextEdit->appendPlainText(fileList.at(i));
       //将选择的文件显示在文本框上
   }
}

知识点讲解:

  • QString curPash = QDir::currentPath();
    获取应用程序当前的目录,也就是当前exe所在目录,可也自行设定。

  • QString dlgTitle=“选择音频文件”;
    文件对话框的标题。

  • QString filter=“音频文件(.mp3 .wav .wma)mp3文件(.mp3);;wav文件(.wav);;wma文件(.wma);;所有文件(.)”;
    用于设置文件过滤,每组文件之间用两个分号隔开,同一组内不同后缀之间用空格隔开。

  • getOpenFileNames( this, “Select one or more files to open”,”/home”,“Images (*.png *.xpm *.jpg)”);
    该函数用于选择打开多个文件,拥有4个参数,需要传递的是后三个参数,分别是对话框标题(dlgTitle),初始化目录(curPash )以及文件过滤器(filter)。返回值为选择文件的带路径的完整文件名,对应的getOpenFileName()函数用于选择并打开一个文件。选择多文件还是单文件,视具体情况而定。

利用创建QFileDialog文件框完成,效果如下:
在这里插入图片描述


2.实现音乐播放(QMediaPlayer类/QMediaPlaylist类)

首先在.h中定义播放器和播放列表,然后在.cpp中实现音乐播放。

别忘了在 .pro文件添加 QT += multimedia 注意QT全部大写,然后继续添加头文件
#include<QtMultimedia/QMediaPlayer> 和 #include<QtMultimedia/QMediaPlaylist>

MainWindow.h

//类中添加
class MainWindow : public QMainWindow
{ 
   
    Q_OBJECT
private:
    QMediaPlayer * player;
    QMediaPlaylist * playlist;
private:
    Ui::MainWindow *ui;
};

MainWindow .cpp

//构造函数中添加
   player = new QMediaPlayer(this);
   playlist = new QMediaPlaylist(this);
   playlist->setPlaybackMode(QMediaPlaylist::Loop);//设置循环模式
   player->setPlaylist(playlist);//获取将播放列表要播放的文件
///
//添加音频文件 槽函数添加如下代码,上面出现的代码已省略
   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()); //用于显示
       //ui->plainTextEdit->appendPlainText(fileList.at(i)); //用于显示
   }
   if(player->state()!=QMediaPlayer::PlayingState)
   { 
   
       playlist->setCurrentIndex(0);
   }
   player->play();

知识点讲解:

  • playlist->addMedia(QUrl::fromLocalFile(aFile));
    通过循环,将文件添加到playlist播放器列表。

  • QFileInfo fileInfo(aFile);
    获取文件的相关信息,例如文件名等等。

  • if(player->state()!=QMediaPlayer::PlayingState)
    {

    playlist->setCurrentIndex(0);
    }
    player->state()会返回当前播放器的状态,:PlayingState(值为1)为播放中状态,对应的还有StoppedState(值为0)空闲状态,PausedState(值为2)播放暂停状态。然后setCurrentIndex()用于设置当前播放列表的序号。

  • player->play();

  • 播放音乐,对应的还有pause()暂停音乐,stop()关闭音乐。


3.实现进度条更新以及文件时长显示

在ui界面拖入Horizontal Bar进度条和tabel(显示文件时长)
添加相关定义和自定义的槽函数:
mainwindow.h

//类中添加
private:
QString durationTime;
QString positionTime;
private slots:
void onDurationChanged(qint64 duration); //文件时长变化,更新当前播放文件名显示
//播放文件数据总大小的信号, 它可以获得文件时间长度。
void onPositionChanged(qint64 position); //当前文件播放位置变化,更新进度显示
//播放到什么位置的信号, 参数是以毫秒来计算的。

mainwindow.cpp

//构造函数中添加
//通过播放器发出的信号调用自定义槽函数 信号是播放器自动触发
connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(onPositionChanged(qint64)));
connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(onDurationChanged(qint64)));
//外面添加
void MainWindow::onDurationChanged(qint64 duration)
{ 
   
    ui->horizontalSlider->setMaximum(duration); //设置进度条最大值 也就是歌曲时长 ms
    int secs = duration/1000; //全部秒数
    int mins = secs/60;//分
    secs = secs % 60;//秒
    durationTime = QString::asprintf("%d:%d",mins,secs);
    ui->label->setText(positionTime+"/"+durationTime);
}
void MainWindow::onPositionChanged(qint64 position)
{ 
   
    if(ui->horizontalSlider->isSliderDown())
        return;//如果手动调整进度条,则不处理
    ui->horizontalSlider->setSliderPosition(position);
    int secs = position/1000;
    int mins = secs/60;
    secs = secs % 60;
    positionTime = QString::asprintf("%d:%d",mins,secs);
    ui->label->setText(positionTime+"/"+durationTime);
}
void MainWindow::on_horizontalSlider_valueChanged(int value)
{ 
   
    player->setPosition(value);//文件播放位置 根据进度条传入的参数
}

效果如下:
在这里插入图片描述


4.存在BUG

1.进度条每次移动一段,而不是匀速移动。

2.在音乐播放中发现存在卡顿情况,将进度条删除,则流畅运行,应该是单线程的问题,更新进度条导致了音乐播放期间的卡顿。

这次就更新到这里,下一期更新暂停,切换歌曲,声音以及移动窗口,还有最重要的修复BUG!!


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/145871.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cuid卡0区被锁_复制门禁卡uid写入失败

    cuid卡0区被锁_复制门禁卡uid写入失败CUID卡是一款支持UID号重复擦写使用的UID卡,无限次修改0扇区!完美替代普通防屏蔽卡(FUID,UFUID)。无需锁卡自动起防屏蔽作用,可重复擦写使用无废卡,不会像FUID或UFUID锁死后才起到防屏蔽作用,更不会因为锁卡而变成一次性卡,无法更改卡内数据成为废卡。CUID防屏蔽卡专门对付物业升级的防复卡和防复读头,是物业升级后UID卡不能使用的克星,CUID卡无论从功能上和价格都优胜FUID…

    2025年7月18日
    4
  • (翻译)什么是Java的永久代(PermGen)内存泄漏

    (翻译)什么是Java的永久代(PermGen)内存泄漏转自:http://www.codelast.com/本文是我对这篇文章的翻译:WhatisaPermGenleak? 为了便于阅读,我将原文附于此处,翻译穿插在其中。此外,为了防止原链接在未来某一天失效后,文中的图片再也看不到的问题,我将原文中的图片也保存到了本站的服务器上,我不知道原作者是否允许这样做,但我翻译本文仅在于传播知识的目的,在此向原作者表示深深的感谢:感谢你

    2022年6月29日
    35
  • pytest报错_git代码提交流程

    pytest报错_git代码提交流程前言我们每天写完自动化用例后都会提交到git仓库,随着用例的增多,为了保证仓库代码的干净,当有用例新增的时候,我们希望只运行新增的未提交git仓库的用例。pytest-picked插件可以

    2022年7月28日
    8
  • SDR SDRAM控制器设计[通俗易懂]

    SDR SDRAM控制器设计[通俗易懂]目录前言1、关于刷新2、关于数据中心对齐3、SDRAM芯片手册介绍3.1SDRAM芯片的管脚3.2SDRAM指令集3.3模式寄存器3.4关于SDRAM上电初始化和装载模式寄存器3.5SDRAM刷新时序3.6关于写访问3.7关于突发访问4、FPGA工程设计5、仿真测试5.1仿真模型5.2testbench前言工作中…

    2022年7月25日
    32
  • java读取pfx格式的证书-并获取公钥私钥

    java读取pfx格式的证书-并获取公钥私钥packagecom.hgh.javase.security;importjava.io.FileInputStream;importjava.security.KeyStore;importjava.security.PrivateKey;importjava.security.PublicKey;importjava.security.cert.Certificate;im

    2022年5月1日
    155
  • window 下 win10 jdk安装与环境变量的配置(超级详细)

    window 下 win10 jdk安装与环境变量的配置(超级详细)1、jdk的下载1.1官网下载地址https://www.oracle.com/java/technologies/javase-downloads.html这里以为下载需要登录所以我准备了百度网盘1.2百度网盘下载链接:https://pan.baidu.com/s/1uBm0XqBtbdafWgn_YUSWLA提取码:2mqh2、新建文件夹2.1、新建Java文件夹我这里选择的是安装的文件夹我在H盘里面新建了个java文件夹,这里盘符可以改的CDE啥都无所谓

    2022年5月3日
    44

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号