QT 简易音乐播放器

目录

放置控件

获取mp3文件

播放音乐

准备工作

加载模块

加载头文件

new一个output对象,Mediaplayer对象

把outpout对象交给mediaplayer对象

给播放器设置音乐

播放

优化

上一曲下一曲功能

双击歌曲播放

获取音乐时长和音乐播放时间

让音乐进度条跟随音乐走

调节音乐进度条更改音乐进度

音量调节

喇叭静音

音量进度条


放置控件

获取mp3文件

首先我们需要点击文件夹按钮的时候弹出一个新界面.因此我们需要QFileDialog类,这个函数就是新增一个界面.然后我们需要调QFileDialog下的getExistingDirectory函数,也就是打开一个已经存在的文件夹.

getExistingDirectory函数的第一个参数是父节点,第二个参数是标题,第三个参数是文件夹路径.返回值是QString:

我们需要把这个字符串转为一个路径,我们可以将其强转为QDir类型,然后再通过entryList函数将该路径下目录里的mp3文件全部过滤出来.代入如下:

cpp 复制代码
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文件:

cpp 复制代码
  ui->listWidget->addItems(musicList);

我们拉一个横向滑块作为音乐进度条,一个纵向滑块作为音量调节条:

播放音乐

准备工作

加载模块

cpp 复制代码
QT       += core gui multimedia

加载头文件

cpp 复制代码
#include<QMediaPlayer>  //播放器
#include<QAudioOutput>  //输出

new一个output对象,Mediaplayer对象

cpp 复制代码
    //先new一个output对象
    auto audioOutput=new QAudioOutput(this);  //把内存交给当前窗口管理(即关闭当前窗口就析构)
    //再new一个Mediaplayer对象
    auto mediaplayer=new QMediaPlayer(this);

把outpout对象交给mediaplayer对象

cpp 复制代码
    mediaplayer->setAudioOutput(audioOutput);

给播放器设置音乐

cpp 复制代码
mediaplayer->setSource(QUrl::fromLocalFile("D:/QTproject/music/assert/Music/来一碗老于 - 解药 (Single Version).mp3"));

播放

cpp 复制代码
mediaplayer->play();

现在选中文件之后就会自动播放mediaplayer指向的setSource里路径下的音乐.

但是我们的需求是通过我们的音乐播放按钮播放我们listwidget上选中的音乐.

优化

我们首先让光标默认选择默认选中第一首歌(即选中第一行)

cpp 复制代码
ui->listWidget->setCurrentRow(0);

然后我们把音乐完整路径保存到qlist里

cpp 复制代码
    
    QList<QUrl> playlist;  //全局变量,定义于.h文件

    for(auto file:musicList)
    {
        playlist.append(QUrl::fromLocalFile(path+"/"+file));
    }

经过上面的步骤,所有的歌都存到playlist里面了

现在我们就可以通过播放按钮来播放音乐了(点击播放键调用playlist里和光标选中行一样下标的音乐)

cpp 复制代码
//播放音乐按钮
void MainWindow::on_btn_play_clicked()
{
   //播放当前选中的音乐

     //获取选择的行
     int index=ui->listWidget->currentRow();
     //播放对应下标的音乐
     mediaplayer->setSource(playlist[index]);
     mediaplayer->play();
}

此时我们通过点击播放按钮可以达到播放音乐的效果,但是不能停止音乐.因此我们需要一个标志位,来标识当前是什么状态:

cpp 复制代码
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下标--

cpp 复制代码
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下标++

cpp 复制代码
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);

cpp 复制代码
void MainWindow::on_listWidget_doubleClicked(const QModelIndex &index)
{
    CurIndexPlay=index.row();
    mediaplayer->setSource(playlist[CurIndexPlay]);
    mediaplayer->play();
}

这样我们就可以双击歌曲直接播放了

获取音乐时长和音乐播放时间

获取当前音乐播放时长必须通过信号与槽来获取

现在就可以显示当前正在播放的音乐的进度时间和音乐总时长

让音乐进度条跟随音乐走

现在我们让进度条跟随音乐进度:

现在进度条就可以跟着音乐走了:"

调节音乐进度条更改音乐进度

cpp 复制代码
    connect(ui->playCourseSlider,&QSlider::sliderMoved,mediaplayer,&QMediaPlayer::setPosition);

音量调节

可以看到ui中有一个喇叭,旁边有一个进度条,我们实现拖动进度条改变音量,而直接点击喇叭则静音,再次点击喇叭开音.

1.进度条右键,选择valueChange()槽函数,注意不要选两个参数的。

喇叭静音

cpp 复制代码
//拖动音量进度条改变声音
void MainWindow::on_Sound_heigorlow_valueChanged(int value)
{
    audioOutput->setVolume(value);
}

音量进度条

已经有一个名为audioOutputQAudioOutput对象,以及一个名为btn_sound的按钮。

首先,您需要在MainWindow类中添加一个成员变量来跟踪当前的静音状态:

cpp 复制代码
// MainWindow类的私有部分
QAudioOutput *audioOutput; // 假设您已经有一个QAudioOutput对象
bool isMuted = false; // 用于跟踪是否静音

// 在构造函数或初始化代码中连接按钮信号
connect(ui->btn_sound, &QPushButton::clicked, this, &MainWindow::toggleMute);

然后,实现toggleMute槽函数:

cpp 复制代码
void MainWindow::toggleMute()
{
    // 切换静音状态
    isMuted = !isMuted;

    // 设置音量以反映新的静音状态
    if (isMuted) {
        // 如果是静音状态,则设置音量为0
        audioOutput->setVolume(0.0);
    } else {
        // 如果不是静音状态,则设置音量为1(或者您希望的非静音音量)
        audioOutput->setVolume(1.0);
    }
}

因为我们不想让音量条一开始就显示出来,又因为qslide没有visible属性.所以我们只能在MainWindow的构造函数或初始化函数中设置滑块为隐藏状态

cpp 复制代码
ui->Sound_heigorlow->setVisible(false);

这样,音量条初始时就不会显示出来了:

相关推荐
Theodore_10221 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
----云烟----3 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024063 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic4 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it4 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康4 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神4 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
宅小海5 小时前
scala String
大数据·开发语言·scala
qq_327342735 小时前
Java实现离线身份证号码OCR识别
java·开发语言
锅包肉的九珍5 小时前
Scala的Array数组
开发语言·后端·scala