音乐播放器开发------Day2

3 播放功能开发

3.1 导入相关工具及头文件

#include//widget.h中添加该头文件(该头文件是QMediaPlayer使用)

上面头文件导入后还是不能识别,需要在.pro项目里添加工具包,内容如下:

QT	+= core gui
QT	+= multimedia

音乐播放器开发------Day2_第1张图片
Widget类里添加使用到的成员变量,如下

QString m_currentMusicName;//记录当前的音乐名
QString m_musicName[MAXMUSICSIZE];//定义一个数组来存放音乐名,后面的MAXMUSICSIZE为宏,记录可以添加的最大音乐数
int m_MusicNum;//记录总共有多少首音乐
QMediaPlayer *m_player;//音乐播放类

Widget类里测试播放音乐功能,播放步骤如下:

//new 一个QMediaPlayer对象
m_player = new QMediaPlayer;
//测试播放歌曲
connect(m_player, SIGNAL(positionChanged(qint64)), this, SLOT(positionChanged(qint64)));
m_player->setMedia(QUrl::fromLocalFile("F:/音乐/陈翔 - 烟火.mp3"));
m_player->setVolume(50);
m_player->play();

3.2 添加歌曲(可以使用布隆过滤器优化)

音乐播放器开发------Day2_第2张图片
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8xNP2qMv-1635861832904)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20211017205904916.png)]

如上所示,选中添加歌曲按钮,定义槽函数(clicked())
音乐播放器开发------Day2_第3张图片槽函数中打开文件框,需调用QFileDialog类的静态函数,返回值为选中的歌曲加上路径,使用时需要添加头文件"#include "

//逻辑分析
//添加QFileDialog 头文件
//定义一个QStringList链表来接收选中的文件
//将选中的文件添加到音乐数组中
	//设置去重
	//音乐计数器++
//歌曲名显示到UI界面上
//使用到QString 的split函数来分割字符串

注意:添加歌曲时一定要在之前添加歌曲的后面接着添加,不然会覆盖原先的歌曲,如下:

音乐播放器开发------Day2_第4张图片
其中,file[i]为打开的歌曲文件,语句m_musicName[m_MusicNum++] = files[i]的意思就是接着数组后面的歌继续添加。
3.3 选中播放(播放/暂停)
音乐播放器开发------Day2_第5张图片选中歌曲时,按一下歌曲键播放歌曲,交替按下这个按键时,在播放和暂停之间来回切换,并切换UI按钮图片

//逻辑如下
//由于需要判断歌曲是播放还是暂停状态,因此需要定义一个类的成员变量(其他地方也需要使用)m_bIsPlayer
//获取选中的位置
//异常分析:如果选中的位置不在范围内
//判断是切换歌曲还是播放/暂停
    //如果是切换歌曲
    //如果是播放/暂停
        //判断当前歌曲是播放状态还是暂停状态
        //如果是播放--》暂停
        //如果是暂停--》播放
        //切换UI按钮图标
int row = ui->lw_musicList->currentRow();//获取选中行
ui->pb_pauseAndPlayer->setIcon(QIcon(":/images/bfzn_pause.png"));//设置播放按钮图片  其中":/..."开头说明取的是QT资源文件里的图片
m_currentMusicName = ui->lw_musicList->currentItem()->text();//获取选中文本框的内容

3.4 双击播放
音乐播放器开发------Day2_第6张图片如上所示,点击listwidget控件定义双击槽函数。
设计逻辑

//获取点击位置
    int row = ui->lw_musicList->currentRow();
    //异常处理
    //判断当前歌曲状态:播放--》双击播放  暂停--》双击播放
	//播放状态
        m_player->setMedia(QUrl::fromLocalFile(m_musicName[row]));
        m_player->play();
        //设置当前播放歌曲名
        m_currentMusicName = ui->lw_musicList->currentItem()->text();
        //暂停状态
        //设置当前播放歌曲名
        m_currentMusicName = ui->lw_musicList->currentItem()->text();
        //设置播放图标
        ui->pb_pauseAndPlayer->setIcon(QIcon(":/images/bfzn_pause.png"));
        //切换播放状态

注意:每次歌曲的状态发生改变时都需要更新歌曲状态,歌曲名

3.5 SQLite持久化且打开软件自动加载
此处需要添加头文件:#include

项目.pro中需要添加如下内容

include (./sqlapi/sqlapi.pri)

INCLUDEPATH += ./sqlapi

封装一个loadMusicList()函数来将数据库里的数据加载到内存。该函数内实现主要有以下功能:

使用API

QDir tempPath;//该类为文件夹类,可以用来判断一个文件夹是否存在
QDir::currentPath();//静态函数,用来获得当前程序路径
tempPath.exits(Path);//判断该文件夹是否存在
tempPath.mkdir(Path);//创建文件夹

qDebuf();//该函数为头文件#include 里的函数  和cout类似

QFile file(DBpath+"/sql/" + fileName);//该类为文件类 使用该类需要添加头文件 #include 
file.exits(Path);//判断文件是否存在
file.open(QIODevice::WriteOnly|QIODevice::Text);//打开一个文件,如果文件不存在则创建

QMessageBox::about(this,"提示","数据库创建失败!");//弹出警告对话框,需要包含头文件#include 

//数据库接口
m_sql->ConnectSql(DBpath+"/sql/" + fileName);//连接数据库
m_sql->UpdateSql(sqlstr);//更新数据库
m_sql->SelectSql(sqlstr,1,strlst);//从数据库中查询

//格式化字符串
QString sqlstr = QString("insert into t_musicList(musicName , musicPath) values ('%1','%2')")
                    .arg(list[list.size()-1]).arg( files[i]);//第一个arg填充%1的位置,第二个填充%2的位置

首先,一个完整的音乐播放器需要有images,lrc,music,sql文件夹,每个文件夹用来存放各自的数据。因此,如果没有文件夹就需要先创建该文件夹,创建示例如下:

//获得当前路径
QString DBpath = QString(QDir::currentPath());
//数据库名
QString fileName("music.db");
// 查看该路径下是否存在 sql,lrc,music,images 文件夹
QDir tempPath;
//如果sql 路径不存在
if(!tempPath.exists(DBpath+"/sql/")){
//不存在就创建
qDebug()<<"创建/sql/文件夹";//使用该函数需要添加头文件#include 
tempPath.mkdir(DBpath+"/sql/");
}

在处理完文件夹后,我们需要判断数据库是否存在,数据库如果不存在则需创建数据库并创建音乐表和声音表,如果存在则需要加载表中的数据到程序中,音乐表含有音乐名和音乐路径,声音表只含有一个声音。详细如下:

//获得当前路径
    QString DBpath = QString(QDir::currentPath());
    //数据库名
    QString fileName("music.db");
    // 查看该路径下是否存在 sql,lrc,music,images 文件夹
    QDir tempPath;
    //如果sql 路径不存在
    if(!tempPath.exists(DBpath+"/sql/")){
        //不存在就创建
        qDebug()<<"创建/sql/文件夹";
        tempPath.mkdir(DBpath+"/sql/");
    }
   ...

    QFile file(DBpath+"/sql/" + fileName);
    if(file.exists()){//如果数据库存在
        //将数据库里的数据添加到歌单 并设置音量为退出前音量
        QStringList strlst;
        //连接数据库
        m_sql->ConnectSql(DBpath+"/sql/" + fileName);
        //数据库里的歌添加到歌单
        QString sqlstr("SELECT musicName,musicPath FROM t_musicList");
        if(m_sql->SelectSql(sqlstr,2,strlst)){
        ...
            }

        }else{
            QMessageBox::about(this,"提示","搜索数据库音乐列表获取歌单失败");
        }
        //音量
        sqlstr = "SELECT volume FROM t_volume";
        if(m_sql->SelectSql(sqlstr,1,strlst) && strlst.size() > 0){
            m_player->setVolume(strlst[0].toInt());
        }
    }else{//数据库不存在
        if(!file.open(QIODevice::WriteOnly|QIODevice::Text)){
            QMessageBox::about(this,"提示","数据库创建失败!");
        }else{//连接数据库:创建 歌曲表,音量表
            file.close();
            m_sql->ConnectSql(DBpath+"/sql/" + fileName);
            QString sqlstr("CREATE TABLE t_musicList(musicName VARCHAR(260),musicPath VARCHAR(260))");//创建歌曲表
            m_sql->UpdateSql(sqlstr);
            //创建音量表
            ...
        }
    }

你可能感兴趣的:(音乐播放器开发,qt,c++,后端)