文档章节

QT5:C++实现基于multimedia的音乐播放器(二)

o
 osc_x4h57ch8
发布于 2018/04/24 15:23
字数 1660
阅读 11
收藏 0

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

今天接着上一篇来实现播放器的槽函数。

先来实现播放模式,槽函数如下:

 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 }

音乐播放器就这样实现完毕了,如果你觉得太简陋的话,可以重写鼠标右键函数来添加选取某一歌曲播放、删除某一歌曲、删除全部歌曲等等功能,还可以添加歌词显示的功能。

o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

263. Ugly Number

题目: 263. Ugly Number 题目地址:https://leetcode.com/problems/ugly-number/ Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers......

JiaMing
20分钟前
34
0
HCIA_ARP01

ARP(地址解析协议) eNSP 常用路由器:AR2220 常用交换机:S5700、S3700 常用终端:PC、MCS(主播服务器) 设备连线:Copper(以太网用到的双绞线)、Serial(串口线,2SA接口)、Auto(自动连...

创业789
23分钟前
13
0
如何在Rails 4中使用问题 - How to use concerns in Rails 4

问题: The default Rails 4 project generator now creates the directory "concerns" under controllers and models. 默认的Rails 4项目生成器现在在控制器和模型下创建目录“Concer”。 ......

fyin1314
27分钟前
19
0
【LeetCode】 57 括号生成

题目: 解题思路: https://leetcode-cn.com/problems/generate-parentheses/solution/hui-su-suan-fa-by-liweiwei1419/ 代码: import java.util.ArrayList;import java.util.List;publ......

JaneRoad
昨天
8
0
度小满上线“推有钱”贷款推广平台,合伙人直推佣金为贷款金额的2.5%

来源 | 镭射财经 作者 | 黄老邪 2020年,蓬勃发展的消金行业受到新冠肺炎疫情的冲击,用户增长放缓、逾期率上升成为共性问题。但疫情或许只是导火索,对于消金行业来说,用户增长红利的消退,...

镭射财经
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部