QT实现简单的音乐播放器

时间:2025-03-25 07:44:28
#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); }