本文共 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;isetText(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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!