#include "music.h"
int Music::mode=0;//初始化静态变量,设置播放模式为0,0表示随机模式
Music::Music(QWidget *parent)
: QWidget(parent)
{
init_window();//初始化界面
loadQss();//加载样式表
//关联播放
connect(player,&QMediaPlayer::durationChanged,this,&Music::showMessage);
connect(player,&QMediaPlayer::metaDataAvailableChanged,this,&Music::showMessage);
connect(musicSlider,&QSlider::sliderMoved,this,&Music::changMusicPostion);//拖动音乐播放进度条改变音乐播放的进度
connect(list,&QListWidget::itemDoubleClicked,this,&Music::removeMusicItem);//双击list列表中的选项则删除选项
}
Music::~Music()
{
}
//初始化界面,创建按钮
void Music::init_window()
{
this->setWindowFlags(Qt::FramelessWindowHint);//不带标题的窗口
this->resize(500,600);
this->setWindowIcon(QIcon(":/image/log.ico"));
showtitle=new QLabel("逍遥居音乐播放器",this);
showtitle->setGeometry(10,10,200,40);
showtitle->setFont(QFont("华文新魏",15,QFont::Bold));
volumed=50;//初始音量为50
BtnaddMusic=new QPushButton(this);
BtnaddMusic->setGeometry(320,10,50,50);
BtnaddMusic->setToolTip(tr("添加歌曲"));
BtnaddMusic->setObjectName(tr("BtnaddMusic"));
Btnmin=new QPushButton(this);
Btnmin->setGeometry(380,10,50,50);
Btnmin->setToolTip(tr("最小化窗口"));
Btnmin->setObjectName(tr("Btnmin"));
BtnClose=new QPushButton(this);
BtnClose->setGeometry(440,10,50,50);
BtnClose->setToolTip(tr("关闭窗口"));
BtnClose->setCursor(Qt::PointingHandCursor);
BtnClose->setObjectName(tr("BtnClose"));
showCurrMusicName=new QLabel(this);
showCurrMusicName->setText("");
showCurrMusicName->setGeometry(20,60,200,30);
showCurrMusicTime=new QLabel(this);
showCurrMusicTime->setText("00:00");
showCurrMusicTime->setGeometry(20,90,40,30);
musicSlider=new QSlider(Qt::Horizontal,this);
musicSlider->setGeometry(60,90,300,30);
musicSlider->setValue(0);
showCurrMusicNumTime=new QLabel(this);
showCurrMusicNumTime->setGeometry(380,90,40,30);
showCurrMusicNumTime->setText("00:00");
volumecontrol=new QSlider(Qt::Vertical,this);
volumecontrol->setGeometry(440,70,40,100);
volumecontrol->setValue(50);
BtnMode=new QPushButton(this);
BtnMode->setGeometry(60,180,50,50);
BtnMode->setToolTip("随机播放");
BtnMode->setCursor(Qt::PointingHandCursor);
BtnMode->setObjectName("BtnMode");
BtnPre=new QPushButton(this);
BtnPre->setGeometry(200,180,50,50);
BtnPre->setToolTip(tr("上一首"));
BtnPre->setObjectName("BtnPre");
BtnPlaye=new QPushButton(this);
BtnPlaye->setGeometry(270,180,50,50);
BtnPlaye->setToolTip(tr("播放"));
BtnPlaye->setObjectName("BtnPlaye");
BtnNext=new QPushButton(this);
BtnNext->setGeometry(340,180,50,50);
BtnNext->setToolTip(tr("下一首"));
BtnNext->setObjectName("BtnNext");
list=new QListWidget(this);
list->setGeometry(30,270,440,300);
list ->setStyleSheet("background: rgba(0,0,0,0.1);");
list->setContextMenuPolicy(Qt::CustomContextMenu);//设置QListWidget支持右键菜单;
add=false;
player=new QMediaPlayer;
player->setVolume(volumecontrol->value());
playlist=new QMediaPlaylist;
//信号关联
connect(BtnClose,&QPushButton::clicked,this,&Music::close);
connect(Btnmin,&QPushButton::clicked,this,&Music::showMinimized);
connect(BtnaddMusic,&QPushButton::clicked,this,&Music::addmusic);
connect(BtnPlaye,&QPushButton::clicked,this,&Music::playerMusic);
connect(player,&QMediaPlayer::positionChanged,this,&Music::changMusicSliderPostion);
connect(BtnPre,&QPushButton::clicked,this,&Music::premusic);//上一首
connect(BtnNext,&QPushButton::clicked,this,&Music::nextmusic);//下一首
connect(volumecontrol,&QSlider::sliderMoved,this,&Music::volumeChang);//音量精度条移动改变播放音乐音量
connect(BtnMode,&QPushButton::clicked,this,&Music::changMusicMode);//改变音乐模式
connect(list,&QListWidget::customContextMenuRequested,this,&Music::OnListContextMenu);//在qlistwidget控件上右击显示菜单
}
//添加歌曲
void Music::addmusic()
{
QString songfileName,songName;
QFileInfo info;
QStringList filenames=QFileDialog::getOpenFileNames(this,"添加歌曲","","music(*.mp3)");
//判断列表是否为空
if(!filenames.isEmpty())
{
add=true;
}
for(int i=0;i<filenames.size();i++)
{
playlist->addMedia(QUrl::fromLocalFile(filenames.at(i)));
songfileName=filenames.at(i);
info=QFileInfo(songfileName);
songName=info.fileName();
list->addItem(songName);
}
playlist->setCurrentIndex(0);
//判断播放列表的模式
if(mode==0)
{
//随机播放
playlist->setPlaybackMode(QMediaPlaylist::Random);
}
else if(mode==1)
{ //顺序播放,
playlist->setPlaybackMode(QMediaPlaylist::Sequential);
}
else
{
//单曲循环
playlist->setPlaybackMode(QMediaPlaylist::CurrentItemInLoop);
}
//设置播放的列表
player->setPlaylist(playlist);
}
//显示音乐信息
void Music::showMusicinfo(QLabel*lable, qint64 postion)
{
postion/=1000;
int h=postion/3600;
int m=(postion-h*3600)/60;
int s=postion-h*3600-m*60;
QTime disytime(h,m,s);
lable->setText(disytime.toString("mm:ss"));
}
//显示音乐信息重写方法
void Music::showMusicinfo(QLabel *lable, QString info)
{
lable->setText(info);
}
//拖动音乐播放进度条改变歌曲播放的进度
void Music::changMusicPostion(qint64 postion)
{
player->setPosition(postion*1000);
showMusicinfo(showCurrMusicTime,postion);
}
//播放的时候改变播放进度条
void Music::changMusicSliderPostion(qint64 postion)
{
//设置播放进度条最大值
musicSlider->setMaximum(player->duration()/1000);
musicSlider->setValue(postion/1000);
//显示当前播放了多少秒
showMusicinfo(showCurrMusicTime,postion);
}
//显示当前播放的歌曲名和
void Music::showMessage(bool ok)
{
QString name;
QString author;
QString info;
if(ok)
{
name=player->metaData(QMediaMetaData::Title).toString();
author=player->metaData(QMediaMetaData::Author).toString();
info=("正在播放 "+name+" _"+author);
showMusicinfo(showCurrMusicName,info);
showMusicinfo(showCurrMusicNumTime,player->duration());
}
else
{
name=" ";
author=" ";
//如果为发false,则清空显示播放歌曲信息,总时长,当前时长
info=("暂未有播放的歌曲 "+name+" _"+author);
showMusicinfo(showCurrMusicName,info);
showMusicinfo(showCurrMusicNumTime,0);
}
}
//播放音乐
void Music::playerMusic()
{
//音乐播放列表为空,提示先添加音乐
if(!add)
{
QMessageBox::information(this,"播放列表为空","请先添加要播放音乐文件");
addmusic();
}
else
{
//判断播放按钮的状态,处于播放状态,则暂停播放
if(player->state()==QMediaPlayer::PlayingState)
{
player->pause();//暂停播放
//改变播放按钮的背景图片
BtnPlaye->setStyleSheet("QPushButton:!hover{border-image: url(:/image/pause.png);}"
"QPushButton:hover{border-image: url(:/image/pause.png);}"
"QPushButton:pressed{border-image: url(:/image/pause.png);}"
);
}
else
{
player->play();//播放
//改变播放按钮的背景图片
BtnPlaye->setStyleSheet("QPushButton:!hover{border-image: url(:/image/play.png);}"
"QPushButton:hover{border-ima