QT 加载歌词LRC文件

QString lrcPath = path.mid(0, path.lastIndexOf(".")) + QString(".lrc"); // 歌曲文件路径转lrc路径

QFile file(lrcPath);
if( file.open(QIODevice::ReadOnly | QIODevice::Text) )
{
    QTextStream stream(&file);

// stream.setCodec(QTextCodec::codecForName(“UTF-8”));

    QString readStr = stream.readAll();
    
    QRegularExpression rex("\\[(\\d+)?:(\\d+\\.\\d+)?\\]"); // 正则表达式
    QRegularExpressionMatch match = rex.match(readStr);
    
    readStr = readStr.mid(match.capturedStart(), readStr.length() - match.capturedStart()); // 去掉 匹配到的第一个时间戳前的无用字符串

    while(true)
    {
        LrcFormat lrc;
        lrc.ms = static_cast((match.captured(1).toInt() * 60000 + match.captured(2).toDouble() * 1000)); // 毫秒
        lrc.lrc = readStr.mid(match.capturedLength(), readStr.indexOf("\n") - match.capturedLength() + 1).simplified(); // 歌词
        readStr = readStr.mid(readStr.indexOf("\n") + 1, readStr.length() - readStr.indexOf("\n")); // 截取 已解析的字符串

        match = rex.match(readStr);
        lrclist.append(lrc); // QVector 结构体容器

        if( readStr.indexOf("\n") < 0 ) // 结尾
        {
            LrcFormat end;
            end.ms = static_cast((match.captured(1).toInt() * 60000 + match.captured(2).toDouble() * 1000));
            end.lrc = readStr.mid(match.capturedLength(), readStr.indexOf("\n") - match.capturedLength() + 1).simplified();
            lrclist.append(end); 
            break;
        }
    }

    file.close();
}

// 结构体
typedef struct _tLrcFormat
{
unsigned int ms;
QString lrc;
} LrcFormat;

LRC处理比较困难的地方 主要是 很多人不会使用、不了解正则表达式
也有不用正则表达式的处理方式, 就是找[ 符号, 从 [ 符号开始, 到\n换行符结尾为一段 这样去解析.

你可能感兴趣的:(QT 加载歌词LRC文件)