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

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

 //播放模式
void Music::musicPlayPattern()
{ //z=++z%3;
if(z==)
{
//顺序播放
playPattern->setStyleSheet("QPushButton:!hover{border-image: url(:/image/Seq.png);}"
"QPushButton:hover{border-image: url(:/image/Seq.png);}"
"QPushButton:pressed{border-image: url(:/image/Seq.png);}"
);
playPattern->setToolTip(tr("列表循环"));
playList->setPlaybackMode(QMediaPlaylist::Sequential);
z = ; }
else if(z==)
{
//随机播放
playPattern->setStyleSheet("QPushButton:!hover{border-image: url(:/image/Ran.png);}"
"QPushButton:hover{border-image: url(:/image/Ran.png);}"
"QPushButton:pressed{border-image: url(:/image/Ran.png);}"
);
playPattern->setToolTip(tr("随机播放"));
playList->setPlaybackMode(QMediaPlaylist::Random);
z--; }
else
{
//单曲循环
playPattern->setStyleSheet("QPushButton:!hover{border-image: url(:/image/Single.png);}"
"QPushButton:hover{border-image: url(:/image/Single.png);}"
"QPushButton:pressed{border-image: url(:/image/Single.png);}"
);
playPattern->setToolTip(tr("单曲循环"));
playList->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
z--;
}
}

里面的 Z 是一个静态变量(static),要在music.cpp里进行赋初值:

 int Music::z = ;

我在播放器界面上创建了一个切换播放模式的按钮,用鼠标点击按钮时,会切换播放模式且按钮背景更换为相应的播放模式图片,Z 的值也会变化,以此让下一次点击按钮时能进行判断该更换哪种播放模式和按钮背景图片。

然后是添加歌曲的槽函数:

 void Music::addMoremusic()
{
QString songFileName,songName;
QFileInfo info;
QStringList fileNames = QFileDialog::getOpenFileNames(this, tr("打开文件"),"",tr("music(*.mp3)"));
if(!fileNames.isEmpty())
{
add = true;
}
for(int i = ; i < fileNames.size(); i ++)
{
playList -> addMedia(QUrl::fromLocalFile(fileNames.at(i)));//将音乐文件逐一加入到播放列表
songFileName = fileNames.at(i);
info = QFileInfo(songFileName);
songName = info.fileName();
list ->addItem(songName);//添加歌曲名到界面的歌曲列表
message -> setText(tr("添加成功"));
} playList->setCurrentIndex();
if(z == )
{
playList->setPlaybackMode(QMediaPlaylist::Random);
}
else if(z == )
{
playList->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
}
else
{
playList->setPlaybackMode(QMediaPlaylist::Sequential);
}
player -> setPlaylist(playList);
BtnPlay->setStyleSheet("QPushButton:!hover{border-image: url(:/image/play_hover.png);}"
"QPushButton:hover{border-image: url(:/image/play_hover.png);}"
"QPushButton:pressed{border-image: url(:/image/play_press.png);}"
); connect(timer2, SIGNAL(timeout()), this, SLOT(clearMessage()));//使用clearMessage()函数来清除上面显示的”添加成功“
timer2 ->start();
} void Music::clearMessage()
{
message -> setText(""); }

在添加歌曲时根据 Z 值设置播放模式是为了解决在没添加歌曲时点击了切换播放模式按钮,导致在添加歌曲后出现按钮背景图片与当前播放模式不一致的问题。

添加完歌曲当然是播放啦,下面是播放按钮和上、下首歌曲的槽函数:

 void Music::playMusic()
{ if(!add)
{
QMessageBox::information(this,"添加音乐","请先添加音乐","确定");
}
else
{ if(player -> state() == QMediaPlayer::PlayingState)//判断是否为播放模式
{ //设置播放模式为暂停
player -> pause();
timer ->stop();
//改变播放按钮的背景图片
BtnPlay->setStyleSheet("QPushButton:!hover{border-image: url(:/image/play_hover.png);}"
"QPushButton:hover{border-image: url(:/image/play_hover.png);}"
"QPushButton:pressed{border-image: url(:/image/play_press.png);}"
); }
else
{
//否则设置播放模式
player -> play();
connect(timer, SIGNAL(timeout()), this, SLOT(posChange()));
timer->start(); BtnPlay->setStyleSheet("QPushButton:!hover{border-image: url(:/image/pause_hover.png);}"
"QPushButton:hover{border-image: url(:/image/pause_hover.png);}"
"QPushButton:pressed{border-image: url(:/image/pause_press.png);}"
); }
}
} void Music::preMusic()
{
//上一首,并更新播放时间为0
moved = ;
playList ->previous(); } void Music::nextMusic()
{
//下一首,更新播放时间为0
moved = ;
playList->next();
}

在上一篇的music的构造函数中(Music::Music(QWidget *parent) : QWidget(parent){ }),设置了add的初始值为false:

     this -> setWindowFlags(Qt::FramelessWindowHint);
add = false;//设置初始值
moved = ;
timer = new QTimer(this);

然后在添加歌曲的槽函数里进行了判断,如果添加歌曲成功,则add的值变为true:

 if(!fileNames.isEmpty())
{
add = true;//add的值变为true
}

当鼠标点击播放歌曲按钮时,add的值会被用来进行判断播放器有没有添加歌曲,如果值为flase,则弹框提醒还没有添加歌曲,值为true的话,就播放歌曲:

  if(!add)
{
QMessageBox::information(this,"添加音乐","请先添加音乐","确定");
}

调节音量的实现就比较简单了,QT自带了函数:

 void Music::volumChange(int vol)
{
//关联滑块的移动,设置播放的音量
player -> setVolume(vol);
}

静音的槽函数还是要我们自己写的,因为要更换喇叭(静音开关图标)的背景图片:

 void Music::meteOpen()
{
static bool flag=true;//判断是否已点击
if(flag){ //如果点击小喇叭,则改变小喇叭按钮的背景图像 muteButton->setStyleSheet("QPushButton:!hover{border-image: url(:/image/sound_close.png)}"
"QPushButton:hover{border-image: url(:/image/sound_close.png)}"
"QPushButton:pressed{border-image: url(:/image/sound_close.png)}"
"QPushButton:focus{padding:-1;}");
muteButton->setToolTip(tr("打开声音"));
player -> setMuted(true); }else{
muteButton->setStyleSheet("QPushButton:!hover{border-image: url(:/image/sound.png)}"
"QPushButton:hover{border-image: url(:/image/sound.png)}"
"QPushButton:pressed{border-image: url(:/image/sound.png)}"
"QPushButton:focus{padding:-1;}"); muteButton->setToolTip(tr("关闭声音"));
player -> setMuted(false);
}
flag=!flag;
}

显示音量进度的滑动条以及音乐已播放时长的实现是我在写这个音乐播放器时花时间比较久的一个地方:

 void Music::positionChange(qint64 position)
{
seekSlider->setMaximum(player->duration() / );//设置滑块的长度范围为音乐长.00度
seekSlider->setValue(position / );//如果音乐进度改变,则改变滑块显示位置
moved = position;//让播放时间等于音乐进度(毫秒)
QTime moveTime(,(moved/) % ,(moved / ) % );//设置时间
showPro ->setText(moveTime.toString("mm:ss"));//显示时间
}
//滑动滑动条快进、倒退音乐,且音乐已播放时长也跟着变化
void Music::seekChange(int position)
{
player -> setPosition(position * );//如果滑块改变位置,则改变音乐进度
moved = position * ;//让播放时间等于音乐进度(毫秒)
QTime moveTime(,(moved/) % ,(moved / ) % );//设置时间
showPro ->setText(moveTime.toString("mm:ss"));//显示时间
}
//当歌曲播放完毕后,让时间清零
void Music::posChange()
{
if(moved >= player -> duration())
{
moved = ;
}
}
//显示当前播放歌曲的名字以及歌曲时间长度
void Music::showMessage(bool ok)
{
if(ok)
{
QString name= player->metaData(QMediaMetaData::Title).toString();
QString author= player->metaData(QMediaMetaData::Author).toString();
showMge -> setText("正在播放:"+name + " -" + author); QTime displayTime(,(player -> duration() / ) % ,(player ->duration() / ) % );
showTime -> setText(displayTime.toString("mm:ss")); }
}

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

QT5:C++实现基于multimedia的音乐播放器(二)的更多相关文章

  1. QT5:C++实现基于Multimedia的音乐播放器(序)

    前段时间C++课设,决定做个播放器,于是参考了网上的代码后,做了个很简陋的音乐播放器(只写了MP3格式)出来,虽然功能甚少,但还是决定把过程记录一下. 成品如下图: 播放器功能: 上.下一首,音量控制 ...

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

    上一篇里简略的描述了一下播放器的实现,这一篇开始具体描述一下过程. 环境配置:Qt Creator 打开Qt Creator,创建一个new project,项目名称随你喜欢(我的是MusicPlay ...

  3. 基于jQuery虾米音乐播放器样式代码

    分享一款基于jQuery虾米音乐播放器样式代码.这是一款基于jquery+html5实现的虾米音乐播放器源码下载.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div c ...

  4. Android基于发展Service音乐播放器

    这是一个基于Service组件的音乐播放器,程序的音乐将会由后台的Service组件负责播放,当后台的播放状态改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台Activit ...

  5. BroadcastReceiver的实例----基于Service的音乐播放器之一

    下面的程序开发了一个基于Service的音乐盒,程序的音乐将会由后台运行的Service组件负责播放,当后台的播放状态发生改变时,程序将会通过发送广播通知前台Activity更新界面:当用户单击前台A ...

  6. BroadcastReceiver的实例----基于Service的音乐播放器之二

    该程序的后台Service会在播放状态发生改变时对外发送广播(广播将会激发前台Activity的BroadcastReceiver):它也会采用BroadcastReceiver监听来自前台Activ ...

  7. Swift 3 :基于 AVAudioPlayer 的简单音乐播放器

    2017.05.22 17:46* 字数 1585 阅读 5095评论 0喜欢 8赞赏 2 https://www.jianshu.com/p/4d5c257428a1 学习ios以来差不多接近两个月 ...

  8. html网页音乐播放器自带播放列表

    基于网页的音乐播放器demo  http://pan.baidu.com/s/1dDgm7HR 自己diy了一个手机端在线音乐播放器演示地址http://shanxi2014.com/zhuandiz ...

  9. SE Springer小组之《Spring音乐播放器》需求分析说明书一

    软件需求说明书 软件需求说明书的编制是为了使用户和软件开发者双方对该软件的初始规定有一个共同的理解, 使之成为整个开发工作的基础. 1 引言 1.1编写目的 使用户对该软件的初始规定有一个理解,也使软 ...

随机推荐

  1. /dev/null 2>&1的意思(可以直接参考shell重定向那篇,/dev/null是空设备)

    路还长 别太狂 以后指不定谁辉煌 2>&1 和 &> 的解释 Linux的IO输入输出有三类 Standard Input 代码 0 Standard Output 代码 ...

  2. windows下程序启动检查,只启动一个实例

    问题来源:http://bbs.csdn.net/topics/390998279?page=1#post-398983061 // Only_once.cpp : 定义控制台应用程序的入口点. // ...

  3. 说说struts2中拦截器的请求流程一(模拟大致流程)

    本文可作为北京尚学堂struts2课程的学习笔记. 首先 什么是拦截器?拦截器能干什么? 拦截器,顾名思义就是拦截对象然后做操作的东西,至于是拦截谁?那自然是拦截action了.能做什么操作呢?你想让 ...

  4. ITU-T Technical Paper: QoS 的参数(非常的全,共计88个)

    本文翻译自ITU-T的Technical Paper:<How to increase QoS/QoE of IP-based platform(s) to regionally agreed ...

  5. 【53】java的多线程同步剖析

    synchronized关键字介绍: synchronized锁定的是对象,这个很重要 例子: class Sync { public synchronized void test() { Syste ...

  6. App Store10大被拒理由

    最近,苹果在官网给出了截至2015年2月份应用被拒绝的十大理由,其中50%以上的应用被拒绝都是因为这10个原因,其中7个理由和2014年相同,其中排名前三的原因分别是:需要补充更多信息.存在明显的bu ...

  7. redis持久化AOF与RDB

    RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot). AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原 ...

  8. mac os x下的一些小技巧

    1显示swap空间: sysctl vm.swapusage 其中sysctl中有很多可以控制和查看的项,可以通过sysctl -A列举,另外可以通过man sysctl来查看. 而实际swap文件和 ...

  9. ubuntu14.04下安装rubinius测试原生线程

    因为CRuby(MRI)本身不支持原生多线程,所以想试一下其他ruby解释器实现对原生多线程的支持.于是安装rubinius折腾一下:) 在rubinius官网下载2.4.1源代码,然后驾轻就熟首先b ...

  10. rails应用ajax之三:进一步完善ajax动画特效果

    本猫已经对界面放低标准很久了,但是复习了ajax之后突然发现:哇!原来世界可以这么美,这么生动鲜活的!所以本篇主要讨论下如何用ajax在rails中做一些简单的动画效果. 其实最新版的的rails中使 ...