Qt開發的音樂播放器

花了大半天時間擼了一個基於Qt5的音樂播放器玩玩,

目錄

一、github地址

二、功能清單

三、界面效果

四、主要代碼介紹

一、獲取本地mp3

二、播放上一首歌

三、播放音樂

四、播放模式(隨機、單曲循環、順序)

五、音量、進度調節


一、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鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章