1. 程式人生 > >QT5:C++實現基於multimedia的音樂播放器(二)

QT5:C++實現基於multimedia的音樂播放器(二)

彈框 rem tooltip loop dialog ets posit list sch

今天接著上一篇來實現播放器的槽函數。

先來實現播放模式,槽函數如下:

技術分享圖片
 1 //播放模式
 2 void Music::musicPlayPattern()
 3 {
 4 
 5         //z=++z%3;
 6         if(z==0)
 7         {
 8             //順序播放
 9             playPattern->setStyleSheet("QPushButton:!hover{border-image: url(:/image/Seq.png);}"
10                                        "
QPushButton:hover{border-image: url(:/image/Seq.png);}" 11 "QPushButton:pressed{border-image: url(:/image/Seq.png);}" 12 ); 13 playPattern->setToolTip(tr("列表循環")); 14 playList->setPlaybackMode(QMediaPlaylist::Sequential);
15 z = 2; 16 17 } 18 else if(z==1) 19 { 20 //隨機播放 21 playPattern->setStyleSheet("QPushButton:!hover{border-image: url(:/image/Ran.png);}" 22 "QPushButton:hover{border-image: url(:/image/Ran.png);}" 23 "
QPushButton:pressed{border-image: url(:/image/Ran.png);}" 24 ); 25 playPattern->setToolTip(tr("隨機播放")); 26 playList->setPlaybackMode(QMediaPlaylist::Random); 27 z--; 28 29 } 30 else 31 { 32 //單曲循環 33 playPattern->setStyleSheet("QPushButton:!hover{border-image: url(:/image/Single.png);}" 34 "QPushButton:hover{border-image: url(:/image/Single.png);}" 35 "QPushButton:pressed{border-image: url(:/image/Single.png);}" 36 ); 37 playPattern->setToolTip(tr("單曲循環")); 38 playList->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop); 39 z--; 40 } 41 }
View Code

裏面的 Z 是一個靜態變量(static),要在music.cpp裏進行賦初值:

1 int Music::z = 2;

我在播放器界面上創建了一個切換播放模式的按鈕,用鼠標點擊按鈕時,會切換播放模式且按鈕背景更換為相應的播放模式圖片,Z 的值也會變化,以此讓下一次點擊按鈕時能進行判斷該更換哪種播放模式和按鈕背景圖片。

然後是添加歌曲的槽函數:

技術分享圖片
 1 void Music::addMoremusic()
 2 {
 3     QString songFileName,songName;
 4     QFileInfo info;
 5     QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("打開文件"),"",tr("music(*.mp3)"));
 6     if(!fileNames.isEmpty())
 7     {
 8         add = true;
 9     }
10     for(int i = 0; i < fileNames.size(); i ++)
11     {
12         playList -> addMedia(QUrl::fromLocalFile(fileNames.at(i)));//將音樂文件逐一加入到播放列表
13         songFileName = fileNames.at(i);
14         info = QFileInfo(songFileName);
15         songName = info.fileName();
16         list ->addItem(songName);//添加歌曲名到界面的歌曲列表
17         message -> setText(tr("添加成功"));
18     }
19 
20     playList->setCurrentIndex(0);
21     if(z == 0)
22     {
23         playList->setPlaybackMode(QMediaPlaylist::Random);
24     }
25     else if(z == 1)
26     {
27         playList->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
28     }
29     else
30     {
31         playList->setPlaybackMode(QMediaPlaylist::Sequential);
32     }
33     player -> setPlaylist(playList);
34     BtnPlay->setStyleSheet("QPushButton:!hover{border-image: url(:/image/play_hover.png);}"
35                            "QPushButton:hover{border-image: url(:/image/play_hover.png);}"
36                            "QPushButton:pressed{border-image: url(:/image/play_press.png);}"
37                            );
38 
39     connect(timer2, SIGNAL(timeout()), this, SLOT(clearMessage()));//使用clearMessage()函數來清除上面顯示的”添加成功“
40     timer2 ->start(2000);
41 }
42 
43 void Music::clearMessage()
44 {
45     message -> setText("");
46 
47 }
View Code

在添加歌曲時根據 Z 值設置播放模式是為了解決在沒添加歌曲時點擊了切換播放模式按鈕,導致在添加歌曲後出現按鈕背景圖片與當前播放模式不一致的問題。

添加完歌曲當然是播放啦,下面是播放按鈕和上、下首歌曲的槽函數:

技術分享圖片
 1 void Music::playMusic()
 2 {
 3 
 4     if(!add)
 5     {
 6         QMessageBox::information(this,"添加音樂","請先添加音樂","確定");
 7     }
 8     else
 9     {
10 
11         if(player -> state() == QMediaPlayer::PlayingState)//判斷是否為播放模式
12         {
13 
14             //設置播放模式為暫停
15             player -> pause();
16             timer ->stop();
17             //改變播放按鈕的背景圖片
18             BtnPlay->setStyleSheet("QPushButton:!hover{border-image: url(:/image/play_hover.png);}"
19                                    "QPushButton:hover{border-image: url(:/image/play_hover.png);}"
20                                    "QPushButton:pressed{border-image: url(:/image/play_press.png);}"
21                                    );
22 
23         }
24         else
25         {
26             //否則設置播放模式
27             player -> play();
28             connect(timer, SIGNAL(timeout()), this, SLOT(posChange()));
29             timer->start(1000);
30 
31             BtnPlay->setStyleSheet("QPushButton:!hover{border-image: url(:/image/pause_hover.png);}"
32                                    "QPushButton:hover{border-image: url(:/image/pause_hover.png);}"
33                                    "QPushButton:pressed{border-image: url(:/image/pause_press.png);}"
34                                    );
35 
36         }
37     }
38 }
39 
40 void Music::preMusic()
41 {
42     //上一首,並更新播放時間為0
43     moved = 0;
44     playList ->previous();
45 
46 }
47 
48 void Music::nextMusic()
49 {
50     //下一首,更新播放時間為0
51     moved = 0;
52     playList->next();
53 }
View Code

在上一篇的music的構造函數中(Music::Music(QWidget *parent) : QWidget(parent){ }),設置了add的初始值為false:

1     this -> setWindowFlags(Qt::FramelessWindowHint);
2     add = false;//設置初始值
3     moved = 0;
4     timer = new QTimer(this);

然後在添加歌曲的槽函數裏進行了判斷,如果添加歌曲成功,則add的值變為true:

1 if(!fileNames.isEmpty())
2     {
3         add = true;//add的值變為true
4     }

當鼠標點擊播放歌曲按鈕時,add的值會被用來進行判斷播放器有沒有添加歌曲,如果值為flase,則彈框提醒還沒有添加歌曲,值為true的話,就播放歌曲:

1  if(!add)
2     {
3         QMessageBox::information(this,"添加音樂","請先添加音樂","確定");
4     }

調節音量的實現就比較簡單了,QT自帶了函數:

1 void Music::volumChange(int vol)
2 {
3     //關聯滑塊的移動,設置播放的音量
4     player -> setVolume(vol);
5 }

靜音的槽函數還是要我們自己寫的,因為要更換喇叭(靜音開關圖標)的背景圖片:

 1 void Music::meteOpen()
 2 {
 3     static bool flag=true;//判斷是否已點擊
 4     if(flag){
 5 
 6         //如果點擊小喇叭,則改變小喇叭按鈕的背景圖像
 7 
 8         muteButton->setStyleSheet("QPushButton:!hover{border-image: url(:/image/sound_close.png)}"
 9                                   "QPushButton:hover{border-image: url(:/image/sound_close.png)}"
10                                   "QPushButton:pressed{border-image: url(:/image/sound_close.png)}"
11                                   "QPushButton:focus{padding:-1;}");
12         muteButton->setToolTip(tr("打開聲音"));
13         player -> setMuted(true);
14 
15     }else{
16         muteButton->setStyleSheet("QPushButton:!hover{border-image: url(:/image/sound.png)}"
17                                   "QPushButton:hover{border-image: url(:/image/sound.png)}"
18                                   "QPushButton:pressed{border-image: url(:/image/sound.png)}"
19                                   "QPushButton:focus{padding:-1;}");
20 
21         muteButton->setToolTip(tr("關閉聲音"));
22         player -> setMuted(false);
23     }
24     flag=!flag;
25 }

顯示音量進度的滑動條以及音樂已播放時長的實現是我在寫這個音樂播放器時花時間比較久的一個地方:

 1 void Music::positionChange(qint64 position)
 2 {
 3     seekSlider->setMaximum(player->duration() / 1000);//設置滑塊的長度範圍為音樂長.00度
 4     seekSlider->setValue(position / 1000);//如果音樂進度改變,則改變滑塊顯示位置
 5     moved = position;//讓播放時間等於音樂進度(毫秒)
 6     QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);//設置時間
 7     showPro ->setText(moveTime.toString("mm:ss"));//顯示時間
 8 }
 9 //滑動滑動條快進、倒退音樂,且音樂已播放時長也跟著變化
10 void Music::seekChange(int position)
11 {
12     player -> setPosition(position * 1000);//如果滑塊改變位置,則改變音樂進度
13     moved = position * 1000;//讓播放時間等於音樂進度(毫秒)
14     QTime moveTime(0,(moved/60000) % 60,(moved / 1000) % 60);//設置時間
15     showPro ->setText(moveTime.toString("mm:ss"));//顯示時間
16 }
17 //當歌曲播放完畢後,讓時間清零
18 void Music::posChange()
19 {
20     if(moved >= player -> duration())
21     {
22         moved = 0;
23     }
24 }
25 //顯示當前播放歌曲的名字以及歌曲時間長度
26 void Music::showMessage(bool ok)
27 {
28     if(ok)
29     {
30         QString name= player->metaData(QMediaMetaData::Title).toString();
31         QString author= player->metaData(QMediaMetaData::Author).toString();
32         showMge -> setText("正在播放:"+name + " -" + author);
33 
34         QTime  displayTime(0,(player -> duration() / 60000) % 60,(player ->duration() / 1000) % 60);
35         showTime -> setText(displayTime.toString("mm:ss"));
36 
37 
38     }
39 }

音樂播放器就這樣實現完畢了,如果你覺得太簡陋的話,可以重寫鼠標右鍵函數來添加選取某一歌曲播放、刪除某一歌曲、刪除全部歌曲等等功能,還可以添加歌詞顯示的功能。

QT5:C++實現基於multimedia的音樂播放器(二)