目录
一、github地址
github地址:https://github.com/KindMans/IMuiscPlayer
二、功能清单
目前具有以下功能:
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()<<m_musicList.front();
QStringList list = m_musicList.front().split("/");
for(int i=0;i<list.size()-1;i++)
{
m_filePath+=list.at(i)+"/";
}
qDebug()<<m_filePath;
ui->tabWidget->setCurrentIndex(0);
showList();
}
这个是加载本地音乐的槽函数,其中使用QFileDialog::getOpenFileNames()打开多个文件。
void IMusicPlayer::showList()
{
static int cnt=0;
if(m_musicList.size()==0)
return;
for(int i=0;i<m_musicList.size();i++){
QListWidgetItem *listwidgetItem = new QListWidgetItem;
QString fileName=m_musicList.at(i).section("/",-1);
if(cnt==0){
listwidgetItem->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()<<temp;
listwidget->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()<<"当前行:"<<ui->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链接。