上一篇里简略的描述了一下播放器的实现,这一篇开始具体描述一下过程。

环境配置:Qt Creator

打开Qt Creator,创建一个new project,项目名称随你喜欢(我的是MusicPlayer),类名也随你喜欢(我的是Music),基类选择QWidget,不勾选界面UI(你也可以勾选UI,用QT自带的UI设计来创建界面),然后要记住项目保存路径不能有中文

创建成功后,在MusicPlayer.pro(项目名称.pro)里加上“QT += multimedia”这一句:

 QT += core gui
QT += multimedia
greaterThan(QT_MAJOR_VERSION, ): QT += widgets

然后在头文件music.h(类名.h)里添加要用到的头文件名:

 #include <QWidget>
#include <QMediaPlayer>
#include <QPushButton>
#include <QSlider>
#include <QLabel>
#include <QTime>
#include <QPaintEvent>
#include <QMediaPlaylist>
#include <QTimer>
#include <QListWidget>

并且在music类里写上要用到的对象成员和函数:

 class Music : public QWidget
{
Q_OBJECT
public:
explicit Music(QWidget *parent = );
static int z; public slots:
void addMoremusic();
void playMusic();
void preMusic();
void nextMusic();
void meteOpen();
void volumChange(int);
void positionChange(qint64 position);
void showMessage(bool);
void seekChange(int position);
void posChange();
void clearMessage();
void musicPlayPattern(); private:
void init_controls();
void init_skin(); QPushButton *BtnClose;
QPushButton *BtnMin;
QPushButton *BtnPlay;
QPushButton *BtnPrev;
QPushButton *BtnNext;
QPushButton *muteButton;
QPushButton *addMore;
QPushButton *playPattern;
QSlider *volumeControl;
QSlider *seekSlider;
QLabel *showTime;
QLabel *showPro;
QLabel *showMge;
QLabel *title;
QLabel *message;
QListWidget *list;
bool add;
QTimer *timer;
QTimer *timer2;
int moved;
QPoint dragPosition;
QMediaPlayer *player;
QMediaPlaylist * playList; protected:
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
};

还要在源文件music.cpp里加上要用的头文件名:

 #include "music.h"
#include <QPixmap>
#include <QFile>
#include <QPainter>
#include <QFileDialog>
#include <QUrl>
#include <QDebug>
#include <QMediaMetaData>
#include <QMessageBox>
#include <QFileInfo>

接着添加资源文件,把要用的图标和背景图片都添加到项目里,然后就可以在music.cpp里写播放器的界面了。

 Music::Music(QWidget *parent) : QWidget(parent)
{
QPixmap background;
background.load(":/image/music_bg.bmp");//加载背景图片
this -> resize(background.width(),background.height());//设置窗口和背景图片大小一致
this -> setWindowFlags(Qt::FramelessWindowHint);//产生一个无窗口边框的窗口,用户无法改变它的大小也无法移动它
add = false;
moved = ;
timer = new QTimer(this);
timer2 = new QTimer(this); player = new QMediaPlayer(this);//QMediaplayer用于解析音频文件和视频文件
playList = new QMediaPlaylist; init_controls();//创建按钮
init_skin();//外部加载qss文件,绘制界面样式 connect(player, SIGNAL(metaDataAvailableChanged(bool)), this, SLOT(showMessage(bool)));
connect(seekSlider,SIGNAL(sliderMoved(int)), this,SLOT(seekChange(int)));
}

因为我创建的是一个无法移动的窗体,所以重写鼠标左键函数来让它可以被移动,这样的话,鼠标左键按住时可以拖动窗体了:

//令窗口可以被拖动
void Music::mousePressEvent(QMouseEvent *event){
if(event->buttons()==Qt::LeftButton)
{
dragPosition=event->globalPos()-frameGeometry().topLeft();
event->accept();
}
} void Music::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
{
this ->move(event->globalPos() - dragPosition);
event->accept();
}
}
//绘制背景
void Music::paintEvent(QPaintEvent *event)
{
QPainter paint(this);
QPixmap backgound;
backgound.load(":/image/music_bg.bmp");
paint.drawPixmap(, , backgound.width(), backgound.height(),backgound);
event ->accept(); }

然后写创建按钮的函数以及连接槽函数来响应信号的连接语句:

//创建按钮
void Music::init_controls()
{
BtnClose = new QPushButton(this);
BtnClose -> setObjectName("BtnClose");//如果要对这个对象单独设stylesheet的话一定要设置它的objectName
BtnClose -> setGeometry(,,,);//窗口左上角为原点(X365,Y2),(宽30,高30)
BtnClose -> setToolTip(tr("退出"));
BtnClose -> setCursor(QCursor(Qt::PointingHandCursor));//鼠标指针形状为手 BtnMin=new QPushButton(this);
BtnMin->setObjectName(tr("BtnMin"));
BtnMin->setGeometry(,,,);
BtnMin->setToolTip(tr("最小化"));
BtnMin->setCursor(QCursor(Qt::PointingHandCursor)); playPattern=new QPushButton(this);
/*QIcon icon1(":/image/Seq.png");
playPattern->setIcon(icon1);*/
playPattern->setObjectName(tr("playPattern"));
playPattern->setGeometry(,,,);
playPattern->setToolTip(tr("列表循环"));
playPattern->setCursor(QCursor(Qt::PointingHandCursor)); BtnPlay=new QPushButton(this);
BtnPlay->setObjectName(tr("BtnPlay"));
BtnPlay->setGeometry(,,,);
BtnPlay->setToolTip(tr("播放"));
BtnPlay->setCursor(QCursor(Qt::PointingHandCursor)); BtnPrev=new QPushButton(this);
BtnPrev->setObjectName(tr("BtnPrev"));
BtnPrev->setGeometry(,,,);
BtnPrev->setToolTip(tr("上一首"));
BtnPrev->setCursor(QCursor(Qt::PointingHandCursor)); BtnNext=new QPushButton(this);
BtnNext->setObjectName(tr("BtnNext"));
BtnNext->setGeometry(,,,);
BtnNext->setToolTip(tr("下一首"));
BtnNext->setCursor(QCursor(Qt::PointingHandCursor)); muteButton=new QPushButton(this);
muteButton->setObjectName(tr("muteButton"));
muteButton->setGeometry(,,,);
muteButton->setToolTip(tr("关闭声音"));
muteButton->setCursor(QCursor(Qt::PointingHandCursor)); volumeControl=new QSlider(Qt::Vertical,this);//QSlider(Qt::Vertical,this)创建一个竖直方向的滑动条QSlider控件
volumeControl->setObjectName(tr("volumeControl"));
volumeControl->setGeometry(,,,);
volumeControl->setCursor(QCursor(Qt::PointingHandCursor));
volumeControl->setRange(,);//设置滑动条控件的最小值和最大值
volumeControl ->setValue();//设置初值为50; seekSlider = new QSlider(Qt::Horizontal,this);//QSlider(Qt::Horizontal,this)创建一个水平方向的滑动条QSlider控件
seekSlider -> setGeometry(,,,);
seekSlider->setObjectName(tr("seekSlider"));
seekSlider -> setCursor(QCursor(Qt::PointingHandCursor)); addMore = new QPushButton(this);
addMore -> setGeometry(,,,);
addMore -> setObjectName(tr("addMore"));
addMore->setToolTip(tr("添加歌曲"));
addMore -> setCursor(QCursor(Qt::PointingHandCursor)); showMge = new QLabel(this);
showMge -> setGeometry(,,,);
showMge -> setFont(QFont("Times",,QFont::Bold));//字体使用Times,10号字体,加粗
QPalette pac;//创建调色板
pac.setColor(QPalette::WindowText,QColor(,,));
showMge -> setPalette(pac); list = new QListWidget(this);
list ->setGeometry(,,,);
list -> setFont(QFont("Times",,QFont::Bold));
list -> setPalette(pac);
list ->setStyleSheet("background: rgba(0,0,0,0.1);"); message = new QLabel(this);
message -> setGeometry(,,,);
message -> setFont(QFont("Times",,QFont::Bold));
message -> setPalette(pac); showPro = new QLabel(this);
showPro -> setGeometry(,,,);
showPro -> setFont(QFont("Times",,QFont::Bold));
showPro -> setPalette(pac);
QTime mov(,,);
showPro ->setText(mov.toString("mm:ss")); showTime = new QLabel(this);
showTime -> setGeometry(,,,);
showTime -> setFont(QFont("Times",,QFont::Bold));
showTime -> setPalette(pac);
QTime mo(,,);//QTime 提供时间函数给用户使用
showTime ->setText(mo.toString("mm:ss"));//显示分:秒 title = new QLabel(this);//设置标题
title -> setGeometry(,,,);
title ->setFont(QFont("Times",,QFont::Bold));
QPalette pa;
pa.setColor(QPalette::WindowText,QColor(,,));
title -> setPalette(pa);
title -> setText("MusicPlayer"); //信号与槽
connect(BtnClose, SIGNAL(clicked(bool)), this, SLOT(close()));
connect(BtnMin, SIGNAL(clicked(bool)), this, SLOT(showMinimized()));
connect(addMore, SIGNAL(clicked(bool)), this, SLOT(addMoremusic()));
connect(BtnPlay, SIGNAL(clicked(bool)), this, SLOT(playMusic()));
connect (BtnPrev,SIGNAL(clicked(bool)), this, SLOT(preMusic()));
connect(BtnNext, SIGNAL(clicked(bool)), this, SLOT(nextMusic()));
connect(muteButton, SIGNAL(clicked(bool)), this, SLOT(meteOpen()));
connect(volumeControl, SIGNAL(sliderMoved(int)), this, SLOT(volumChange(int)));
connect(player,SIGNAL(positionChanged(qint64)),this,SLOT( positionChange(qint64)));
connect(playPattern,SIGNAL(clicked(bool)),this,SLOT(musicPlayPattern())); }

但界面很丑,所以下一步就是加载qss文件,绘制界面样式:

 //外部加载qss文件,绘制界面样式
void Music::init_skin()
{
QFile file(":/qss/skin.qss");
file.open(QFile::ReadOnly);
this -> setStyleSheet(QObject::tr(file.readAll()));
file.close(); }

我的qss代码如下(qss和css的语法几乎一模一样):

 QPushButton#playPattern:!hover
{
border-image: url(:/image/Seq.png);
}
QPushButton#playPattern:hover
{
border-image: url(:/image/Seq.png);
}
QPushButton#playPattern:pressed{
border-image: url(:/image/Seq.png);
}
QPushButton#BtnClose:!hover
{
border-image: url(:/image/close.png);
}
QPushButton#BtnClose:hover
{
border-image: url(:/image/close.png);
}
QPushButton#BtnClose:pressed
{
border-image: url(:/image/close.png);
}
QPushButton#BtnClose:focus{padding:-;} QPushButton#addMore
{
border-image: url(:/image/addMore.png); } QPushButton#BtnMin:!hover
{
border-image: url(:/image/min.png);
}
QPushButton#BtnMin:hover
{
border-image: url(:/image/min.png);
}
QPushButton#BtnMin:pressed
{
border-image: url(:/image/min.png);
}
QPushButton#BtnMin:focus{padding:-;} QPushButton#BtnPlay:!hover
{
border-image: url(:/image/play_hover.png);
}
QPushButton#BtnPlay:hover
{
border-image: url(:/image/play_hover.png);
}
QPushButton#BtnPlay:pressed
{
border-image: url(:/image/play_press.png);
}
QPushButton#BtnPlay:focus
{
padding:-;
} QPushButton#BtnPrev:!hover
{
border-image: url(:/image/prev_hover.png);
}
QPushButton#BtnPrev:hover
{
border-image: url(:/image/prev_hover.png);
}
QPushButton#BtnPrev:pressed
{
border-image: url(:/image/prev_press.png);
}
QPushButton#BtnPrev:focus{padding:-;} QPushButton#BtnNext:!hover
{
border-image: url(:/image/next_hover.png);
}
QPushButton#BtnNext:hover
{
border-image: url(:/image/next_hover.png);
}
QPushButton#BtnNext:pressed
{
border-image: url(:/image/next_press.png);
}
QPushButton#BtnNext:focus{padding:-;} QPushButton#muteButton:!hover
{
border-image: url(:/image/sound.png);
}
QPushButton#muteButton:hover
{
border-image: url(:/image/sound.png);
}
QPushButton#muteButton:pressed
{
border-image: url(:/image/sound_close.png);
}
QPushButton#muteButton:focus{padding:-;} QSlider#volumeControl::groove:Vertical {
border: 0px solid #bbb;
background: rgba(,,,0.1);
width: 4px;
border-radius: 1px;
} QSlider#volumeControl::sub-page:Vertical {
background: rgba(,,,0.1);
border: 0px solid #;
width: 4px;
border-radius: 1px;
} QSlider#volumeControl::add-page:Vertical {
background:url(:/image/progress_sound.bmp);
border: 0px solid #;
width: 4px;
border-radius: 1px;
} QSlider#volumeControl::handle:Vertical {
border-image:url(:/image/progress_thume.png);
border: 0px solid #;
width: 28px;
height: 28px;
margin-left:-12px;
margin-right:-12px;
margin-top: -12px;
margin-bottom: -12px;
border-radius: 4px;
} QSlider#seekSlider::groove:horizontal {
border-left:-14px solid;
background: rgba(,,,0.1);
height: 4px;
border-radius: 4px;
} QSlider#seekSlider::sub-page:horizontal {
background:url(:/image/progress.bmp);
border: 0px solid #;
height: 4px;
border-radius: 4px;
} QSlider#seekSlider::add-page:horizontal {
background: rgba(,,,0.1);
border: 0px solid #;
height: 4px;
border-radius:4px;
} QSlider#seekSlider::handle:horizontal {
background:url(:/image/progress_thume.png);
border: 0px solid #;
width: 28px;
height: 28px;
border-left:0px;
border-right:0px;
margin-left:2px;
margin-right:-12px;
margin-top: -12px;
margin-bottom: -12px;
border-radius: 4px;
}

这样样式就已经基本搞定了,只剩下写槽函数来实现具体功能了。

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

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

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

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

    今天接着上一篇来实现播放器的槽函数. 先来实现播放模式,槽函数如下: //播放模式 void Music::musicPlayPattern() { //z=++z%3; ) { //顺序播放 pla ...

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

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

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

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

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

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

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

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

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

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

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

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

  9. 基于Qt Phonon模块实现音乐播放器

    这次使用Qt实现的是一个本地音乐播放器,可以播放下载在计算机本地的音乐,提供了添加歌曲,歌曲列表,清空列表的功能.默认歌曲列表循环播放.音乐播放的实现主要依赖的是Qt 的多媒体框架phonon.该音乐 ...

随机推荐

  1. Ext.Net 1.x_Ext.Net.GridPanel嵌套Checkbox

    解决办法:拼接HTML var tplchecked = '<input type="checkbox" {0}>'; var IsChecked = function ...

  2. Leetcode_136_Single Number

    本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/42713315 Given an array of inte ...

  3. JSP判断移动设备

    日期: 2014年3月6日 人员::铁锚 看到了一篇很好的文章, <在天猫,前端做什么?>,里面有天猫php判断移动设备的正则(个人猜测),觉得很好用,于是就决定移植到JSP里面. jsp ...

  4. PS图层混合算法之四(亮光, 点光, 线性光, 实色混合)

    亮光模式: 根据绘图色通过增加或降低"对比度",加深或减淡颜色.如果绘图色比50%的灰亮,图像通过降低对比度被照亮,如果绘图色比50%的灰暗,图像通过增加对比度变暗. 线性光模式: ...

  5. MongoDB之整库备份还原单表collection备份还原

    MongoDB之整库备份还原单表collection备份还原 cd D:\MongoDB\bin 1整库备份: mongodump -h dbhost -d dbname -o dbdirectory ...

  6. 解决os x下gdb不能调试的问题

    在较新的os x中使用gdb调试程序会发生 Unable to find Mach task port 之类的错误,这是由于新的os x内核禁止未授权的程序随意控制其他进程,如果不用root权限的话, ...

  7. SharePoint 自定义列表页面定制续—[保存模板后不能正常使用]

    背景:SharePoint列表的四个基本页样式不是特别的好,所以很多情况都需要重新定制,然而经过定制后,又发生了新的问题,就是存成模板,再建新的列表的时候,定制的页面不能正常显示了. 1. 定制后的页 ...

  8. Http的定义及其基本概念介绍

    HTTP的特性 HTTP构建于TCP/IP协议之上,默认端口号是80 HTTP是无连接无状态的 HTTP报文 请求报文 HTTP定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST ...

  9. 和菜鸟一起学linux之常见错误的解决和常用命令

    1.错误提示:make:警告:检测到时钟错误.您的创建可能是不完整的. 解决方法:当前编译目录下,命令行输入:find . -type f -exec touch {} \; 2.SSH生成密钥:ss ...

  10. rails中weill_paginate的paginate方法中不能使用额外参数的解决办法

    我们知道高版本中的rails中的分页功能已经放在will_paginate这个gem中,我们在控制器方法中往往需要调用其paginate方法来实现分页数据集控制,举个例子:正常的情况我们想要每页显示1 ...