目录
放置控件
获取mp3文件
播放音乐
准备工作
加载模块
加载头文件
new一个output对象,Mediaplayer对象
把outpout对象交给mediaplayer对象
给播放器设置音乐
播放
优化
上一曲下一曲功能
双击歌曲播放
获取音乐时长和音乐播放时间
让音乐进度条跟随音乐走
调节音乐进度条更改音乐进度
音量调节
喇叭静音
音量进度条
放置控件
获取mp3文件
首先我们需要点击文件夹按钮的时候弹出一个新界面.因此我们需要QFileDialog类,这个函数就是新增一个界面.然后我们需要调QFileDialog下的getExistingDirectory函数,也就是打开一个已经存在的文件夹.
getExistingDirectory函数的第一个参数是父节点,第二个参数是标题,第三个参数是文件夹路径.返回值是QString:
我们需要把这个字符串转为一个路径,我们可以将其强转为QDir类型,然后再通过entryList函数将该路径下目录里的mp3文件全部过滤出来.代入如下:
void MainWindow::on_explorer_clicked(){ // 弹出文件对话框,让用户选择音乐文件夹,默认路径为"D://QTproject//music//assert//Music" QString path = QFileDialog::getExistingDirectory(this, "请选择音乐", "D://QTproject//music//assert//Music"); // 创建QDir对象,用于操作指定的目录 QDir dir(path); // 获取目录下所有以".mp3"结尾的文件,存入QStringList对象 QStringList musicList = dir.entryList(QStringList()<<"*.mp3"); // 打印音乐列表,用于调试 qInfo()<<musicList; // 将获取到的音乐文件列表添加到UI的listWidget组件中 ui->listWidget->addItems(musicList);}
接下来我们需要把获取到的mp3文件展示出来,我们在主界面上放置一个listWidget控件.然后向listWidget里添加我们将才获取到的mp3文件:
ui->listWidget->addItems(musicList);
我们拉一个横向滑块作为音乐进度条,一个纵向滑块作为音量调节条:
播放音乐
准备工作
加载模块
QT += core gui multimedia
加载头文件
#include<QMediaPlayer> //播放器#include<QAudioOutput> //输出
new一个output对象,Mediaplayer对象
//先new一个output对象 auto audioOutput=new QAudioOutput(this); //把内存交给当前窗口管理(即关闭当前窗口就析构) //再new一个Mediaplayer对象 auto mediaplayer=new QMediaPlayer(this);
把outpout对象交给mediaplayer对象
mediaplayer->setAudioOutput(audioOutput);
给播放器设置音乐
mediaplayer->setSource(QUrl::fromLocalFile("D:/QTproject/music/assert/Music/来一碗老于 - 解药 (Single Version).mp3"));
播放
mediaplayer->play();
现在选中文件之后就会自动播放mediaplayer指向的setSource里路径下的音乐.
但是我们的需求是通过我们的音乐播放按钮播放我们listwidget上选中的音乐.
优化
我们首先让光标默认选择默认选中第一首歌(即选中第一行)
ui->listWidget->setCurrentRow(0);
然后我们把音乐完整路径保存到qlist里
QList<QUrl> playlist; //全局变量,定义于.h文件 for(auto file:musicList) { playlist.append(QUrl::fromLocalFile(path+"/"+file)); }
经过上面的步骤,所有的歌都存到playlist里面了
现在我们就可以通过播放按钮来播放音乐了(点击播放键调用playlist里和光标选中行一样下标的音乐)
//播放音乐按钮void MainWindow::on_btn_play_clicked(){ //播放当前选中的音乐 //获取选择的行 int index=ui->listWidget->currentRow(); //播放对应下标的音乐 mediaplayer->setSource(playlist[index]); mediaplayer->play();}
此时我们通过点击播放按钮可以达到播放音乐的效果,但是不能停止音乐.因此我们需要一个标志位,来标识当前是什么状态:
void MainWindow::on_btn_play_clicked(){ switch(mediaplayer->playbackState()) //播放器当前的播放状态 { case QMediaPlayer::PlaybackState::PlayingState: //播放状态 { //正在播放音乐就暂停音乐 mediaplayer->pause(); break; } case QMediaPlayer::PlaybackState::PausedState: //暂停状态 { //暂停状态就播放音乐 mediaplayer->play(); break; } case QMediaPlayer::PlaybackState::StoppedState: //停止状态 { //停止状态就播放音乐 //播放当前选中的音乐 //获取选择的行 int index=ui->listWidget->currentRow(); //播放对应下标的音乐 mediaplayer->setSource(playlist[index]); mediaplayer->play(); break; } }}
现在我们就可以自由控制播放暂停音乐了.
上一曲下一曲功能
上一曲
上一曲就是让listWidget选择上一行,然后playlist下标--
void MainWindow::on_btn_left_clicked(){ CurIndexPlay--; if(CurIndexPlay<0)CurIndexPlay=playlist.size()-1; //防止下标越界 ui->listWidget->setCurrentRow(CurIndexPlay); mediaplayer->setSource(playlist[CurIndexPlay]); mediaplayer->play();}
下一曲
下一曲就是让ListWidget选择下一行,然后playlist下标++
void MainWindow::on_btn_right_clicked(){ //下一曲就是让Listwidget选择下一行 //mediaplay下标++ CurIndexPlay=(CurIndexPlay+1)%playlist.size(); //为了防止下标越界 ui->listWidget->setCurrentRow(CurIndexPlay); mediaplayer->setSource(playlist[CurIndexPlay]); mediaplayer->play();}
双击歌曲播放
我们重写listwidget的双击槽函数 void on_listWidget_doubleClicked(const QModelIndex &index);
void MainWindow::on_listWidget_doubleClicked(const QModelIndex &index){ CurIndexPlay=index.row(); mediaplayer->setSource(playlist[CurIndexPlay]); mediaplayer->play();}
这样我们就可以双击歌曲直接播放了
获取音乐时长和音乐播放时间
获取当前音乐播放时长必须通过信号与槽来获取
现在就可以显示当前正在播放的音乐的进度时间和音乐总时长
让音乐进度条跟随音乐走
现在我们让进度条跟随音乐进度:
现在进度条就可以跟着音乐走了:"
调节音乐进度条更改音乐进度
connect(ui->playCourseSlider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setPosition);
音量调节
可以看到ui中有一个喇叭,旁边有一个进度条,我们实现拖动进度条改变音量,而直接点击喇叭则静音,再次点击喇叭开音.
1.进度条右键,选择valueChange()槽函数,注意不要选两个参数的。
喇叭静音
//拖动音量进度条改变声音void MainWindow::on_Sound_heigorlow_valueChanged(int value){ audioOutput->setVolume(value);}
音量进度条
已经有一个名为audioOutput
的QAudioOutput
对象,以及一个名为btn_sound
的按钮。
首先,您需要在MainWindow
类中添加一个成员变量来跟踪当前的静音状态:
// MainWindow类的私有部分QAudioOutput *audioOutput; // 假设您已经有一个QAudioOutput对象bool isMuted = false; // 用于跟踪是否静音// 在构造函数或初始化代码中连接按钮信号connect(ui->btn_sound, &QPushButton::clicked, this, &MainWindow::toggleMute);
然后,实现toggleMute
槽函数:
void MainWindow::toggleMute(){ // 切换静音状态 isMuted = !isMuted; // 设置音量以反映新的静音状态 if (isMuted) { // 如果是静音状态,则设置音量为0 audioOutput->setVolume(0.0); } else { // 如果不是静音状态,则设置音量为1(或者您希望的非静音音量) audioOutput->setVolume(1.0); }}
因为我们不想让音量条一开始就显示出来,又因为qslide没有visible属性.所以我们只能在MainWindow的构造函数或初始化函数中设置滑块为隐藏状态
ui->Sound_heigorlow->setVisible(false);
这样,音量条初始时就不会显示出来了: