Qt实现 MusicPlayer(本地)

目录

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

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值