确定基本功能
基本功能包括:
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是播放器总时间的更改(时长发生变化时触发)