#include //widget.h中添加该头文件(该头文件是QMediaPlayer使用)
上面头文件导入后还是不能识别,需要在.pro项目里添加工具包,内容如下:
QT += core gui
QT += multimedia
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 添加歌曲(可以使用布隆过滤器优化)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8xNP2qMv-1635861832904)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20211017205904916.png)]
如上所示,选中添加歌曲按钮,定义槽函数(clicked())
槽函数中打开文件框,需调用QFileDialog
类的静态函数,返回值为选中的歌曲加上路径,使用时需要添加头文件"#include
//逻辑分析
//添加QFileDialog 头文件
//定义一个QStringList链表来接收选中的文件
//将选中的文件添加到音乐数组中
//设置去重
//音乐计数器++
//歌曲名显示到UI界面上
//使用到QString 的split函数来分割字符串
注意:添加歌曲时一定要在之前添加歌曲的后面接着添加,不然会覆盖原先的歌曲,如下:
其中,file[i]
为打开的歌曲文件,语句m_musicName[m_MusicNum++] = files[i]
的意思就是接着数组后面的歌继续添加。
3.3 选中播放(播放/暂停)
选中歌曲时,按一下歌曲键播放歌曲,交替按下这个按键时,在播放和暂停之间来回切换,并切换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 双击播放
如上所示,点击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);
//创建音量表
...
}
}