QT实现简单的音乐播放器
#include ""
#include "ui_widget.h"
#include <QFileDialog>
#include <QTime>
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//先进行布局
//先实例化两种布局
this->vbox = new QVBoxLayout(this); //垂直布局
this->setLayout(this->vbox);//设置整个窗口为垂直布局
this->hbox1 = new QHBoxLayout(this); //按钮层水平布局
this->hbox2 = new QHBoxLayout(this);//标签层水平布局
this->hbox3 = new QHBoxLayout(this);//进度条布局
//实例化对象、从上到下依次为媒体播放、listWidget、label、进度条、各种按钮
this->mediaPlayer = new QMediaPlayer(this);
this->listWidget = new QListWidget(this); //创建结构简单的列表
this->label = new QLabel("00:00/00:00",this); //标签栏
this->labName = new QLabel("暂无音乐",this);
this->volumeSlider = new QSlider(this);//进度条
this->volumeSlider->setMaximumWidth(200);
this->timeSlider = new QSlider(this);
this->comboBox = new QComboBox(this);
this->comboBox->addItem("顺序播放");
this->comboBox->addItem("随机播放");
this->comboBox->addItem("循环播放");
//设置成水平的
this->volumeSlider->setOrientation(Qt::Horizontal);
this->timeSlider->setOrientation(Qt::Horizontal);
this->volumeSlider->setMinimumWidth(100);
this->volumeSlider->setRange(0,100);
this->volumeSlider->setValue(50);
this->openBtn = new QPushButton("打开",this);
this->upBtn = new QPushButton("上一首",this);
this->downBtn = new QPushButton("下一首",this);
this->playBtn = new QPushButton("播放",this);
this->playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPlay));
this->timer = new QTimer(this);
this->n = 0;
this->index = 0;
//给水平布局增加控件
hbox1->addWidget(this->openBtn);
hbox1->addWidget(this->upBtn);
hbox1->addWidget(this->downBtn);
hbox1->addWidget(this->playBtn);
hbox1->addWidget(this->comboBox);
hbox2->addWidget(this->label);
hbox2->addWidget(this->labName);
hbox3->addWidget(this->timeSlider);
hbox3->addWidget(this->volumeSlider);
//垂直布局
vbox->addWidget(this->listWidget);
vbox->addLayout(this->hbox2);
vbox->addLayout(this->hbox3);
vbox->addLayout(this->hbox1);
connect(this->openBtn,SIGNAL(clicked()),this,SLOT(openFile()));
connect(this->playBtn,SIGNAL(clicked()),this,SLOT(playSong()));
connect(this->mediaPlayer,SIGNAL(positionChanged(qint64)),this,SLOT(updateTimeSlider(qint64))); //进度条变化
connect(this->mediaPlayer,SIGNAL(durationChanged(qint64)),this,SLOT(setTimeSlider(qint64)));
connect(this->timer,SIGNAL(timeout()),this,SLOT(updateTime_NameShow())); //滚动显示名字、显示歌曲已播放时间/总时间
connect(this->timeSlider,SIGNAL(sliderMoved(int)),this,SLOT(updateSingPos(int)));
connect(this->volumeSlider,SIGNAL(sliderMoved(int)),this,SLOT(updateVolume(int)));
connect(this->listWidget,SIGNAL(itemDoubleClicked(QListWidgetItem*)),this,SLOT(doubleClickPlay(QListWidgetItem*)));//双击播放
connect(this->upBtn,SIGNAL(clicked()),this,SLOT(pre()));
connect(this->downBtn,SIGNAL(clicked()),this,SLOT(next()));
}
Widget::~Widget()
{
delete ui;
}
//打开文件,并显示到listWidget
void Widget::openFile()
{
/*
1、选择歌曲
2、设置媒体
3、显示歌曲名称
4、设置音量
5、开始播放
*/
//QString fileName = QFileDialog::getOpenFileName(this,"select",".","MP3(*.mp3)");
// if(fileName == "")
// {
// return;
// }
// this->mediaPlayer->setMedia(QUrl(fileName));//设置媒体源
// QFileInfo info(fileName);//获取文件全部信息
// this->singName = ();
// this->labName->setText(this->singName);
this->nameList.clear();
this->listWidget->clear();//清空表单
this->nameList = QFileDialog::getOpenFileNames(this,"select",".","MP3(*.mp3)");
for(int i = 0;i < nameList.size();i++) //循环的将选中的文件加入到listWidget
{
QFileInfo info(nameList.at(i));
QListWidgetItem *item = new QListWidgetItem(info.fileName(),this->listWidget);
this->listWidget->addItem(item);
item->setToolTip(nameList.at(i));//----------
}
QString fileName = nameList.at(0);
this->mediaPlayer->setMedia(QUrl(fileName));//设置媒体源
QFileInfo info(fileName);//获取文件全部信息
this->singName = info.fileName();
this->labName->setText(this->singName);
this->mediaPlayer->setVolume(50);//设置音量
this->mediaPlayer->play();
this->timer->start(1000);
this->playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPause));
}
void Widget::playSong()
{
/*
判断歌曲状态,正在播放/暂停
*/
int state = this->mediaPlayer->state();
if(state == QMediaPlayer::PlayingState)
{
//正在播放,暂停播放,图标修改成播放
this->mediaPlayer->pause();
this->playBtn->setText("播放");
this->playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPlay));
}
else if (state == QMediaPlayer::PausedState) {
//暂停,继续播放,图标修改为暂停
this->mediaPlayer->play();
this->playBtn->setText("暂停");
this->playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPause));
}
}
void Widget::doubleClickPlay(QListWidgetItem *item)//参数为双击的目标信息
{
/*
* 1、获取listWidget中下标位置
2、设置媒体源、播放选中的歌曲
3、修改名字
4、修改图标
5、定时器启动
*/
this->index = this->listWidget->currentRow(); //获取当前下标
this->mediaPlayer->setMedia(QUrl(item->toolTip()));
this->labName->setText(item->text());
this->mediaPlayer->play();
this->timer->start(1000);
this->playBtn->setIcon(this->style()->standardIcon(QStyle::SP_MediaPause));
}
//给进度条设置范围
void Widget::setTimeSlider(qint64 duration)
{
this->timeSlider->setRange(0,int(duration));
}
//根据歌曲播放的位置修改进度条
void Widget::updateTimeSlider(qint64 position)
{
this->timeSlider->setValue(int(position));
}
//滚动显示名字、修改文本时间
//实现播放模式
void Widget::updateTime_NameShow()
{
/*
根据n的值显示内容
*/
this->n++;
if(this->n == this->singName.size())
{
this->n = 0;
}
this->labName->setText(this->singName.mid(this->n));//滚动显示
//获取总时间跟当前播放时长
qint64 dur = this->mediaPlayer->duration();
qint64 pos = this->mediaPlayer->position();
//实例化两个对象,用来显示
QTime durTime(0,0,0);
QTime posTime(0,0,0);
this->label->setText(posTime.addMSecs(int(pos)).toString("mm:ss") + "/" + durTime.addMSecs(int(dur)).toString("mm:ss"));
//根据播放模式进行播放
/*
* 1、顺序播放,下标++,最后一首的时候,下标置为0(dur == pos的时候歌曲结束)
* 2、随机播放,qrand()给下标一个随机值
* 3、循环播放,下表不变
*/
if(dur == pos)
{
if(this->comboBox->currentText() == "顺序播放")
{
this->index++;
if(this->index > this->nameList.size() - 1)
{
this->index = 0;
}
}
else if (this->comboBox->currentText() == "随机播放") {
this->index = qrand() % this->nameList.size();
}
else {
this->index = this->index;
}
//开始播放
QFileInfo fileName(this->nameList.at(this->index));//获取文件信息
this->mediaPlayer->setMedia(QUrl(this->nameList.at(this->index)));//设置媒体源
this->labName->setText(fileName.fileName());//修改标题
this->mediaPlayer->play();
this->timer->start(1000);
}
}
//修改歌曲播放的位置
void Widget::updateSingPos(int positoin)
{
this->mediaPlayer->setPosition(positoin);
}
//修改音量
void Widget::updateVolume(int positoin)
{
this->mediaPlayer->setVolume(positoin);
}
void Widget::pre()
{
/*
* 1、下标--,判断--后下标的值,如果<0,则播放最后一首
* 2、暂停之前播放的歌曲
* 3、获取要播放歌曲的信息
* 4、播放歌曲,设置歌名等
*/
this->index--;
if(this->index < 0)
{
this->index = this->nameList.size() - 1;
}
this->mediaPlayer->stop();
QFileInfo fileName(this->nameList.at(this->index));//获取文件信息
this->mediaPlayer->setMedia(QUrl(this->nameList.at(this->index)));//设置媒体源
this->labName->setText(fileName.fileName());//修改标题
this->mediaPlayer->play();
this->timer->start(1000);
}
void Widget::next()
{
/*
* 1、下标++,判断++后下标的值,如果>最大歌曲数,则播放第一首
* 2、暂停之前播放的歌曲
* 3、获取要播放歌曲的信息
* 4、播放歌曲,设置歌名等
*/
this->index++;
if(this->index > this->nameList.size() - 1)
{
this->index = 0;
}
this->mediaPlayer->stop();
QFileInfo fileName(this->nameList.at(this->index));//获取文件信息
this->mediaPlayer->setMedia(QUrl(this->nameList.at(this->index)));//设置媒体源
this->labName->setText(fileName.fileName());//修改标题
this->mediaPlayer->play();
this->timer->start(1000);
}