前置内容在上一篇【C++】QT | 音乐播放器初级
加载文件需要文件相关,而lrc文件适合用map容器匹配,用计时器来更新歌词:
#include <QMap> // map容器
#include <QFile> // 文件相关
#include <QTimer>
public:
void ReadLRC(const QString & filepath); // 读取对应路径的歌词文件
public slots:
void SetLRC(); // 槽函数,更新歌词
private:
std::map<long long, QString> LRCMap; // map容器,存储歌词:<时间, 歌词>
QTimer timer; // 设置定时器
在ui中增加label_LRC,并调节大小。
读取歌词文件:
ReadLRC("E:\\252QT\\202401\\Test\\music\\千百度.lrc");
......
long long StrToMsec(const QString & timeStr) // 传入QString对象,传回时间(毫秒)
{
auto leftList = timeStr.split(":"); // 先分出分钟
if(leftList.size() != 2) // 没有成功分割为两段时退出
return 0;
auto Min = leftList[0].toInt(); // 字符第一段转为数字,即分钟
auto rightList = leftList[1].split("."); // 剩下的字符按.分割
if(rightList.size() != 2) // 失败退出
return 0;
int sec = rightList[0].toInt(); // .第一段即秒
int msec = rightList[1].toInt(); // 第二段即毫秒
return msec + 1000 * sec + 1000 * 60 * Min; // 总毫秒
}
void Widget::ReadLRC(const QString & filepath) // 读取歌词文件
{
LRCMap.clear(); // 重置路径
QFile file(filepath);
if(file.open(QIODevice::ReadOnly) == true) // 以只读打开
{
QTextStream input(&file); // 读入文件流
while(input.atEnd() != true) // 不在末尾
{
QString content = input.readLine(); // 读取一行
QStringList LRCList = content.split("]"); // 分割时间与歌词
if(LRCList.size() !=