花了大半天時間擼了一個基於Qt5的音樂播放器玩玩,
目錄
一、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鏈接。