生活随笔
收集整理的這篇文章主要介紹了
QT下的音乐播放器 (一)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
確定基本功能
基本功能包括:
1.播放
2.上一首/下一首
3.靜音
4.播放方式
5.進(jìn)度條
6.添加音樂(lè)
7.顯示歌曲的表格
實(shí)現(xiàn)方式:
首先,我們需要幾個(gè)控件(pushbutton,listwidget,slider,label);
界面如下:
此圖片,大家可以先不把這些東西全部寫上去,
先把我寫的功能加上就可以。
我們一個(gè)一個(gè)來(lái):
1.添加音樂(lè)
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
);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
);
這個(gè)過(guò)程中,一定要注意在構(gòu)造函數(shù)中,將播放器和播放列表new出來(lái),并設(shè)置基本格式。
2.播放音樂(lè)
QMediaPlayer
* player
;
bool m_IsPause
= true;if(m_IsPause
==true){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();
這里要注意一點(diǎn):當(dāng)播放的時(shí)候和暫停的時(shí)候,圖標(biāo)的顏色應(yīng)當(dāng)有改變,所以加了一個(gè)狀態(tài)判斷。
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();}
}
這個(gè)要注意:我們?cè)谏弦皇紫乱皇椎倪^(guò)程中,肯定要知道當(dāng)前是第幾首,為了能夠在第一首和最后一首的時(shí)候可以循環(huán)一次進(jìn)行,我們需要通過(guò)總歌曲數(shù)量進(jìn)行判斷。
4.聲音
聲音有兩種表現(xiàn)形式:
一種是直接按小喇叭,一種是進(jìn)度條的拖動(dòng)
bool m_IsVolume
= false;void musicplaywindow
::on_pushButton_6_clicked()
{if(m_IsVolume
==true){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
);
}
進(jìn)度條的拖拽此處是用了值改變,所以拖動(dòng)過(guò)程就會(huì)改變聲音的大小。
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
++;return;}if(m_IsMode
== 3){ui
->pushButton_5
->setStyleSheet("border-image: url(:/kjt/suiji.png);");m_IsMode
=0;playlist
->setPlaybackMode(QMediaPlaylist
::Random
);return;}
單曲循環(huán)并沒(méi)有實(shí)現(xiàn),后續(xù)實(shí)現(xiàn)了會(huì)在后續(xù)說(shuō)明。
6.播放進(jìn)度條
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());
}
這里要注意幾點(diǎn):
1.獲取歌曲總時(shí)長(zhǎng),從而獲取進(jìn)度條長(zhǎng)度,以及l(fā)abel的總時(shí)長(zhǎng)
2.獲取當(dāng)前歌曲時(shí)長(zhǎng),從而獲取進(jìn)度條當(dāng)前值,以及l(fā)abel的時(shí)長(zhǎng)。
3.positionChanged是播放器持續(xù)時(shí)間的更改(播放器當(dāng)前時(shí)間變化時(shí)觸發(fā))
4.durationChanged是播放器總時(shí)間的更改(時(shí)長(zhǎng)發(fā)生變化時(shí)觸發(fā))
總結(jié)
以上是生活随笔為你收集整理的QT下的音乐播放器 (一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。