基于QT开发的⾳乐播放器(附源码)
基于QT开发的⾳乐播放器(附源码)
⼀、简介
1、介绍
  基于C++语⾔的QT开发,主要的知识点有:QT控件的使⽤、信号与槽函数和⼦窗⼝的设置。
2、功能描述
  ⾳乐播放器实现的功能有:暂停和播放⾳乐、切换歌曲、调节⾳量、显⽰歌曲的图⽚、改变进度条、显⽰歌曲的相关信息、与歌曲同步显⽰歌词、显⽰歌曲列表、刷新歌曲列表、点击歌曲便可切换歌曲的列表。
3、系统功能层次模块图
4、各模块功能描述
(1)播放界⾯
  点击播放按键可以播放⾳乐,点击暂停按键可以暂停⾳乐,点击上⼀曲按键切换歌曲到上⼀曲,点击下⼀曲按键切换歌曲到下⼀曲。  点击加⼤⾳量和减⼩⾳量的按键来调节⾳量,也可通过移动⾳量滑动条、在框中输⼊数字和点击框中的上下键来调节。
歌曲的图⽚会随着歌曲的变化⽽变化,如果没有歌曲,则会显⽰默认图⽚。
  改变进度条,歌曲及其播放时间也会随着改变。
  ⿏标停留在按键上时,会显⽰该按键的功能。
(2)歌词
  歌曲从歌曲对应的txt⽂件中调⽤,通过QMap键值对来存储每⼀句歌词,再通过键将每⼀句歌词调⽤并显⽰到界⾯中,能够与歌曲同步显⽰歌词。
(3)歌曲信息
  歌曲信息从歌曲对应的txt⽂件中调⽤,通过QMap键值对来存储开头⼏⾏的歌曲信息,歌曲名字的键
是0、歌⼿名字的键是1000、专辑名字的键是2000、提供者名字的键是3000,再通过键分别将其显⽰到界⾯中。
(4)歌曲列表
  歌曲都存放该项⽬⽂件的music⽂件夹中,歌曲列表能够显⽰在music⽂件下所有的mp3歌曲,点击列表中的歌曲,便可以播放该歌曲。如果在music⽂件夹中添加歌曲,点击刷新便可在列表中显⽰该歌曲。
5、⽂件格式
  1、歌曲⽂件为mp3格式。
  2、歌词⽂件为txt格式。
6、运⾏环境
名称版本语种操作系统Qt Creator  4.3.0UTF-8 
7、软件总体模型
⼆、源代码
    在本账号的资源中有分享出源⽂件
LyricWidget.cpp
#include"LyricWidget.h"
#include"ui_LyricWidget.h"
LyricWidget::LyricWidget(QWidget *parent):
QWidget(parent),
ui(new Ui::LyricWidget)
{
ui->setupUi(this);
}
LyricWidget::~LyricWidget()
{
delete ui;
}
void LyricWidget::slotShowCurrentLrc(){
initlrc(musicName);
}
void LyricWidget::initlrc(const QString& fileName)
{
QString l;
QFile file(LrcPath+fileName);
ists()){
// qDebug("⽂件存在");
}
else{
// qDebug("⽂件不存在");
}
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)){
return;
}
QTextCodec *codec = QTextCodec::codecForName("UTF-8");
while(!file.atEnd())
{
QString line = codec->adLine());
QString line = codec->adLine());    QString s(line);
if(s.length()<4)
continue;
if(s.startsWith("[ti:"))
{
getHeader("[ti:", s);
map.insert(0, s);
ui->topmusicname->setText("歌曲:"+s);
continue;
}
else if(s.startsWith("[ar:"))
{
getHeader("[ar:", s);
map.insert(1000, s);
ui->singer->setText("歌⼿:"+s);
continue;
}
else if(s.startsWith("[al:"))
{
getHeader("[al:", s);
map.insert(2000, s);
ui->album->setText("专辑:"+s);
continue;
}
else if(s.startsWith("[by:"))
{
getHeader("[by:", s);
ui->fromlab->setText("提供者:"+s);
map.insert(3000, s);
continue;
}
else
{
getTime(s);
}
}
file.close();
}
// 获取lrc⽂件的每句的时间
void LyricWidget::getTime(QString line)
{
if(line.startsWith("["))
{
int index = line.indexOf("]");
QString t = line.mid(1, index -1);
QString mm = t.mid(0,2);
QString ss = t.mid(3,2);
int m = mm.toInt();
int s = ss.toInt();
int time = m*60*1000+ s*1000;
t = line.mid(index +1);
index = t.lastIndexOf("]");
if(index <0)
{
map.insert(time, t);
}
else
{
t = t.mid(index +1);
map.insert(time, t);
getTime(t);
}
}
}
}
void LyricWidget::getHeader(const char*str, QString &des)
{
des = ve(str);
des = ve("]");
}
void LyricWidget::showWord(int time)
{
ains(time))
{
ui->label->setText(map.value(time));
}
}
void LyricWidget::cleanmap(){
map.clear();
html播放音乐代码}
widget.cpp
#include"widget.h"
#include"ui_widget.h"
Widget::Widget(QWidget *parent):
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
isPlay=true;
isSilence=false;
lrc=new LyricWidget(this);
lrc->setWindowFlags(Qt::CustomizeWindowHint|Qt::FramelessWindowHint);
lrc->move(210,20);
lrc->show();
ui->startBtn->setIcon(QIcon(":/image/PlayMusic.png"));// 暂停时候显⽰播放图标
ui->startBtn->setIconSize(QSize(50,50));
ui->startBtn->setFlat(true);
ui->startBtn->setStyleSheet("QToolTip{border:1px solid rgb(0, 0, 0); background-color: #ffffff; color:#484848; font-size:12px;}");    ui->startBtn->setToolTip(tr("播放"));// ⿏标停留时显⽰播放⽂字
ui->lastBtn->setIcon(QIcon(":/image/circle_previous.png"));// 显⽰上⼀曲图标
ui->lastBtn->setIconSize(QSize(50,50));
ui->lastBtn->setFlat(true);
ui->lastBtn->setStyleSheet("QToolTip{border:1px solid rgb(0, 0, 0); background-color: #ffffff; color:#484848; font-size:12px;}");    ui->lastBtn->setToolTip(tr("上⼀曲"));// ⿏标停留时显⽰上⼀曲⽂字
ui->nextBtn->setIcon(QIcon(":/image/circle_next.png"));// 显⽰下⼀曲图标
ui->nextBtn->setIconSize(QSize(50,50));
ui->nextBtn->setFlat(true);
ui->nextBtn->setStyleSheet("QToolTip{border:1px solid rgb(0, 0, 0); background-color: #ffffff; color:#4
84848; font-size:12px;}");    ui->nextBtn->setToolTip(tr("下⼀曲"));// ⿏标停留时显⽰下⼀曲⽂字
ui->addBtn->setIcon(QIcon(":/image/addIcon.png"));// 显⽰加⼤⾳量图标
ui->addBtn->setIconSize(QSize(30,30));
ui->addBtn->setFlat(true);
ui->addBtn->setStyleSheet("QToolTip{border:1px solid rgb(0, 0, 0); background-color: #ffffff; color:#484848; font-size:12px;}");    ui->addBtn->setToolTip(tr("加⼤⾳量"));// ⿏标停留时显⽰加⼤⾳量⽂字
ui->loseBtn->setIcon(QIcon(":/image/loseIcon.png"));// 显⽰减⼩⾳量图标
ui->loseBtn->setIconSize(QSize(30,30));
ui->loseBtn->setFlat(true);
ui->loseBtn->setStyleSheet("QToolTip{border:1px solid rgb(0, 0, 0); background-color: #ffffff; color:#484848; font-size:12px;}");    ui->loseBtn->setToolTip(tr("减⼩⾳量"));// ⿏标停留时显⽰减⼩⾳量⽂字
fileList =getFileNames(this->MusicPath);
QImage *img=new QImage;
img->load(":/image/soundOn.png");
*img=img->scaled(20,20,Qt::KeepAspectRatio);
ui->label->setPixmap(QPixmap::fromImage(*img));
player =new QMediaPlayer;
playerlist =new QMediaPlaylist(player);
ui->strTime->setText("00:00");
ui->volumeSlider->setRange(0,100);
ui->volumeSpinBox->setRange(0,100);
ui->volumeSlider->setValue(5);
ui->volumeSpinBox->setValue(5);
player->setVolume(5);
Vposition=5;
for(int i=0;i<fileList.size();i++)
{
QString fileName=fileList.at(i);
(fiaddItemleName);
playerlist->addMedia(QUrl::fromLocalFile(MusicPath+"\\"+fileName));
}
playerlist->setCurrentIndex(0);
player->setPlaylist(playerlist);
/
/ 切换歌曲的同时改变歌曲名和歌曲图⽚
connect(player,SIGNAL(metaDataChanged()),this,SLOT(musicInfo()));
connect(ui->volumeSlider,SIGNAL(valueChanged(int)), ui->volumeSpinBox,SLOT(setValue(int)));
connect(ui->volumeSpinBox,SIGNAL(valueChanged(int)), ui->volumeSlider,SLOT(setValue(int)));
connect(ui->volumeSlider,SIGNAL(valueChanged(int)),this,SLOT(volumChange(int)));
connect(ui->volumeSpinBox,SIGNAL(valueChanged(int)),this,SLOT(volumChange(int)));
connect(ui->startBtn,SIGNAL(clicked(bool)),this,SLOT(play_pause_music()));
connect(ui->listWidget,SIGNAL(currentRowChanged(int)),this,SLOT(play_list_music(int)));
//进度条改变时播放位置随着改变
connect(ui->progressBar,SIGNAL(sliderMoved(int)),this,SLOT(setPlayerPosition(int)));
//当播放歌曲位置改变时progressBar设置对应的位置对应的播放时间与总时间的显⽰
connect(player,SIGNAL(positionChanged(qint64)),this,SLOT(positionChanged(qint64)));
// 当progressBar改变时构造歌曲总时间
connect(player,SIGNAL(durationChanged(qint64)),this,SLOT(durationChanged(qint64)));
connect(player,&QMediaPlayer::currentMediaChanged,lrc,&LyricWidget::slotShowCurrentLrc);
connect(player,&QMediaPlayer::currentMediaChanged,lrc,&LyricWidget::cleanmap);
connect(player,SIGNAL(stateChanged(QMediaPlayer::State)),this,SLOT(skipFirst(QMediaPlayer::State)));
}
Widget::~Widget()
{
delete ui;
}
void Widget::skipFirst(QMediaPlayer::State MusicState)
{

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。