QT5:C++实现基于multimedia的音乐播放器(二)
今天接着上一篇来实现播放器的槽函数。
先来实现播放模式,槽函数如下:
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 }
里面的 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 }
在添加歌曲时根据 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 }
在上一篇的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 }
音乐播放器就这样实现完毕了,如果你觉得太简陋的话,可以重写鼠标右键函数来添加选取某一歌曲播放、删除某一歌曲、删除全部歌曲等等功能,还可以添加歌词显示的功能。