QT下的音乐播放器 (一)

确定基本功能

基本功能包括:
1.播放
2.上一首/下一首
3.静音
4.播放方式
5.进度条
6.添加音乐
7.显示歌曲的表格
实现方式:
首先,我们需要几个控件(pushbutton,listwidget,slider,label);
界面如下:
在这里插入图片描述
此图片,大家可以先不把这些东西全部写上去,
先把我写的功能加上就可以。
我们一个一个来:
1.添加音乐

//类中加入:
    QMediaPlaylist * playlist;//播放列表

//搜索按钮槽函数
QString curPash =QDir::currentPath();
    QString dlgTitle="选择音频文件";
    QString filter="音频文件(*.mp3 *.wav *.wma)mp3文件(*.mp3);;wav文件(*.wav);;wma文件(*.wma);;所有文件(*.*)";
    QStringList fileList = QFileDialog::getOpenFileNames(this,dlgTitle,curPash,filter);
    if(fileList.count()<1)
        return;
    for(int i = 0;i<fileList.count();i++)
    {
        QString aFile = fileList.at(i);
        //qDebug()<<aFile;
        playlist->addMedia(QUrl::fromLocalFile(aFile));
        QFileInfo fileInfo(aFile);
        ui->listWidget->addItem(fileInfo.fileName());
    }
    if(player->state()!=QMediaPlayer::PlayingState)
    {
        playlist->setCurrentIndex(m_Value);
    }
    player->setPlaylist(playlist);

这个过程中,一定要注意在构造函数中,将播放器和播放列表new出来,并设置基本格式。

2.播放音乐

// 类中加入:
QMediaPlayer * player;//播放器
bool m_IsPause = true;//判断播放器状态
 if(m_IsPause==true)//false 为播放
    {
        ui->pushButton_3->setStyleSheet("border-image: url(:/kjt/bf.png);");
        m_IsPause = false;
        player->pause();
        return;
    }
    m_IsPause = true;
    ui->pushButton_3->setStyleSheet("border-image: url(:/kjt/1zantingtingzhi.png);");
    player->play();

这里要注意一点:当播放的时候和暂停的时候,图标的颜色应当有改变,所以加了一个状态判断。
3.上一首/下一首

//类中加入:
    int m_Value=0;//当前歌曲是第几个
    int m_Amount=0;   //总歌曲数量
//上一首
void musicplaywindow::on_pushButton_2_clicked()//上一首
{
    m_Amount = playlist->mediaCount();
    if(m_Value == 0)
    {
        m_Value=m_Amount;
        playlist->setCurrentIndex(m_Value);
        if(m_IsPause==true)
        {
            player->play();
        }
        return;
    }
    playlist->setCurrentIndex(--m_Value);
    if(m_IsPause==true)
    {
        player->play();
    }
}
//下一首
void musicplaywindow::on_pushButton_4_clicked()//下一首
{
    m_Amount = playlist->mediaCount();//总数
    if(m_Value == m_Amount)
    {
        m_Value =0;
        playlist->setCurrentIndex(m_Value);
        if(m_IsPause==true)
        {
            player->play();
        }
        return;
    }
    playlist->setCurrentIndex(++m_Value);
    if(m_IsPause==true)
    {
        player->play();
    }
}

这个要注意:我们在上一首下一首的过程中,肯定要知道当前是第几首,为了能够在第一首和最后一首的时候可以循环一次进行,我们需要通过总歌曲数量进行判断。
4.声音
声音有两种表现形式:
一种是直接按小喇叭,一种是进度条的拖动

//
bool m_IsVolume = false;//判断是否静音

void musicplaywindow::on_pushButton_6_clicked()//静音
{
    if(m_IsVolume ==true)//ture为无声
    {
        m_IsVolume = false;
        ui->pushButton_6->setStyleSheet("border-image: url(:/kjt/shengyin.png);");
        player->setVolume(ui->horizontalSlider_2->value());
        return;
    }
    m_IsVolume = true;
    ui->pushButton_6->setStyleSheet("border-image: url(:/kjt/jingyin.png);");
    player->setVolume(0);
}

void musicplaywindow::on_horizontalSlider_2_valueChanged(int value)//声音大小
{
    player->setVolume(value);
}

进度条的拖拽此处是用了值改变,所以拖动过程就会改变声音的大小。

5.播放方式

//
int m_IsMode;//播放模式

//
if(m_IsMode == 0)//顺序播放
    {
        ui->pushButton_5->setStyleSheet("border-image: url(:/kjt/danqu.png);");
        m_IsMode++;
        playlist->setPlaybackMode(QMediaPlaylist::Sequential);//顺序
        return;
    }
    if(m_IsMode == 1)//循环播放
    {
        ui->pushButton_5->setStyleSheet("border-image: url(:/kjt/xunhuan.png);");
        m_IsMode++;
        playlist->setPlaybackMode(QMediaPlaylist::Loop);//设置循环模式
        return;
    }
    if(m_IsMode == 2)//单曲循环
    {
        ui->pushButton_5->setStyleSheet("border-image: url(:/kjt/danquxunhuan.png);");
        m_IsMode++;
        //playlist->setPlaybackMode(QMediaPlaylist::);//
        return;
    }
    if(m_IsMode == 3)//随机
    {
        ui->pushButton_5->setStyleSheet("border-image: url(:/kjt/suiji.png);");
        m_IsMode =0;
        playlist->setPlaybackMode(QMediaPlaylist::Random);//随机播放
        return;
    }

单曲循环并没有实现,后续实现了会在后续说明。
6.播放进度条

 connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(onPositionChanged(qint64)));
 connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(onDurationChanged(qint64)));

void musicplaywindow::onDurationChanged(qint64 duration)//获取歌曲总时长
{
    ui->horizontalSlider->setMaximum(duration); 
    int secs = duration/1000; 
    int mins = secs/60;
    secs = secs % 60;
    durationTime = QString::asprintf("%d:%d",mins,secs);
    ui->label->setText(positionTime+"/"+durationTime);
}

void musicplaywindow::onPositionChanged(qint64 position)//获取当前时长并做出改变
{
    if(ui->horizontalSlider->isSliderDown())
        return;
    ui->horizontalSlider->setSliderPosition(position);
    int secs = position/1000;
    int mins = secs/60;
    secs = secs % 60;
    positionTime = QString::asprintf("%d:%d",mins,secs);
    ui->label->setText(positionTime+"/"+durationTime);
}

void musicplaywindow::on_horizontalSlider_valueChanged(int value)
{
    player->setPosition(ui->horizontalSlider->value());
}

这里要注意几点:
1.获取歌曲总时长,从而获取进度条长度,以及label的总时长
2.获取当前歌曲时长,从而获取进度条当前值,以及label的时长。
3.positionChanged是播放器持续时间的更改(播放器当前时间变化时触发)
4.durationChanged是播放器总时间的更改(时长发生变化时触发)

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值