Qt实现 MusicPlayer(本地)
发布日期:2021-09-25 21:40:40 浏览次数:23 分类:技术文章

本文共 3667 字,大约阅读时间需要 12 分钟。

目录


一、github地址

github地址:

二、功能清单

目前具有以下功能:

1、加载本地音乐

2、获取播放历史

3、上下歌曲切换

4、播放模式选择(顺序、单曲循环、随机播放)

5、音量调节、歌曲播放进度调节

技术上采用的到Qt主要几个类为QMediaPlayer、QListWidget、QSlider、QFileInfo、QDir

三、界面效果

先看下界面效果,还没优化

 

四、主要代码介绍

一、获取本地mp3

void IMusicPlayer::slot_btn_load_clicked(){    FileSystem fileSystem;    m_musicList = QFileDialog::getOpenFileNames(this,"请选择音乐文件","","*.mp3");    if(m_musicList.size()==0)        return;    qDebug()<
tabWidget->setCurrentIndex(0); showList();}

这个是加载本地音乐的槽函数,其中使用QFileDialog::getOpenFileNames()打开多个文件。

void IMusicPlayer::showList(){    static int cnt=0;    if(m_musicList.size()==0)        return;    for(int i=0;i
setText(fileName); listwidget->insertItem(i+1,listwidgetItem); }else{ QStringList historyNames=getAllListWidgetText(); if(!historyNames.contains(fileName)){ listwidgetItem->setText(fileName); listwidget->insertItem(historyNames.size()+1,listwidgetItem); } } } listwidget->setCurrentRow(0); cnt++;}

使用insertItem插入mp3名字进listwidget中进行显示,静态变量cnt用来区分是否第一次加载,主要是防止添加重复的音乐。getAllListWidgetText()用于获取listwidget所有的元素。

二、播放上一首歌

void IMusicPlayer::slot_btn_prev_clicked(){    m_prevOrnext = true;    m_player.stop();    int nextRow;    int count = listwidget->count();    int currentRow = listwidget->currentRow();    if(currentRow == 0){        nextRow = count-1;    }else    {        nextRow = currentRow-1;    }    QString temp=m_filePath+listwidget->item(nextRow)->text();    qDebug()<
setCurrentRow(nextRow); playMusic(nextRow);}

这里的逻辑主要是对listwidget的当前行进行判断,如果是第一首的上一首,那它的上一首歌曲就是最后一首。反之减一。

三、播放音乐

void IMusicPlayer::playMusic(int row){    setPlayMusicUrl(m_filePath + ui->listWidget->item(row)->text());    m_player.play();    //写入历史文件    recordHistoryMusic(m_hisPath);}

这个接口是用来播放音乐的。主要是通过QMediaPlayer的play()进行mp3的播放。播放后,将当前播放的歌曲写入缓存,用作播放历史记录。QMediaPlayer还提供了pause()接口来暂停歌曲播放,stop()接口停止播放。

四、播放模式(随机、单曲循环、顺序)

void IMusicPlayer::slot_playModelSelect(){    if(m_player.state()==QMediaPlayer::State::StoppedState)    {        if(m_prevOrnext)        {            m_prevOrnext=false;            return;        }        int nextRow = 0;        qDebug()<<"当前行:"<
combox_play_model->currentText(); if(ui->combox_play_model->currentIndex()==0) { int count = listwidget->currentRow(); if(count == listwidget->count()-1) { nextRow = 0; }else{ nextRow = count + 1; } } else if(ui->combox_play_model->currentIndex()==1) { nextRow=numRandom(); } else if(ui->combox_play_model->currentIndex()==2) { nextRow=listwidget->currentRow(); } listwidget->setCurrentRow(nextRow); playMusic(nextRow); }}

这是一个槽函数,通过信号stateChanged(QMediaPlayer::State)触发。QMediaPlayer::State有三种状态,分别是StoppedState(终止),PlayingState(播放中),PausedState(暂停)。通过QCombobox选择播放模式。numRandom()这个接口主要是产生listwidget总行数内的随机数,随机数不包括当前准备播放完毕的歌曲所在的行。

五、音量、进度调节

void IMusicPlayer::slot_modifyProgress(qint64 position){    ui->slider_position->setValue(position);}void IMusicPlayer::slot_duration(qint64 duration){    ui->slider_position->setRange(0,duration);}void IMusicPlayer::slot_setPosition(int value){    if(m_bIsmove)    {       m_player.setPosition(value);       m_bIsmove=false;    }}void IMusicPlayer::slot_position_change_sliderMoved(int position){    Q_UNUSED(position);    m_bIsmove=true;}void IMusicPlayer::slot_volume_change_sliderMoved(int position){    m_player.setVolume(position);}

主要需要灵活掌握QMediaPlayer、QFileInfo、QListWidget、QSlider等类的使用,以及信号和槽的关联,详细代码可参考github链接。

转载地址:https://blog.csdn.net/c_shell_python/article/details/105183563 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:pugi xml读与写接口
下一篇:插入排序算法实现

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年03月25日 12时35分51秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章