用Qt写一个简单的音乐播放器(六):显示歌词(正则表达式)

本文详细介绍使用Qt创建音乐播放器并实现歌词同步显示的过程。包括读取歌词文件、使用正则表达式解析歌词时间与内容、歌词显示的代码实现等关键步骤。

一、前言

用Qt写一个简单的音乐播放器(一):使用QMediaPlayer播放音乐中,我们已经知道如何去使用QMediaPlayer播放音乐。
用Qt写一个简单的音乐播放器(二):增加界面(开始和暂停音乐)中,我们增加了播放音乐/暂停音乐的按钮。
用Qt写一个简单的音乐播放器(三):增加界面(播放跳转与音量控制)中,我们加入了播放控制和音量控制。
用Qt写一个简单的音乐播放器(四):歌曲浏览、上一曲、下一曲中,我们增加了歌曲选择的功能。
用Qt写一个简单的音乐播放器(五):歌曲播放时间显示中,我们为歌曲播放增加播放时间显示。
那么第六篇文章来谈一谈如何显示歌词:

二、读取歌词文件

在这里插入图片描述
如图所示,首先将同名的歌词文件放入歌曲相同的路径中。
在这里插入图片描述

如上图所示,歌词文件的内容形式为一行一句,所以我们可以将歌词文件逐行读入,代码如下。
mainwindow.cpp中做如下修改

void MainWindow::on_lwMusicList_itemDoubleClicked(QListWidgetItem *item)
{
   
   
    m_PlayRow = ui->lwMusicList->row(item);
    m_mediaPlayer.stop();
    m_mediaPlayer.setMedia(QUrl::fromLocalFile(m_playPath+"/"+item->text()));
    m_mediaPlayer.play();
    QString name = item->text().left(item->text().lastIndexOf("."));
    if(!lyrics.readLyricsFile(m_playPath+"/"+name+".lrc")){
   
   
        ui->lblLyrics1->setText("未检测到歌词文件");
        ui->lblLyrics2->setText("请检查歌词文件是否存在");
    }
    lyricsID = 0;
    ui->hSliderPlayProgress->setValue(m_mediaPlayer.position());
    ui->btnPlay->setText("Pause");
    connect(timer, SIGNAL(timeout()), this, SLOT(setSliderValue()));
    connect(&m_mediaPlayer,SIGNAL(durationChanged(qint64)),this,SLOT(getduration()));
    connect(&m_mediaPlayer,SIGNAL(positionChanged(qint64)),this,SLOT(setPlayTime()));
}

新建一个lyrics类文件,加入以下代码:

bool Lyrics::readLyricsFile(QString lyricsPath)
{
   
   
    QFile file(lyricsPath);
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    QString line="";
    while((line=file.readLine())>0){
   
   
        qDebug()<<line;
        analysisLyricsFile(line);//解析歌词文件内容
    }
    return true;
}

三、解析歌词(正则表达式的使用)

歌词读取一行,我们就对这个歌词进行解析。我这里将歌词分为了两部分:时间和内容。用正则表达式匹配后,将时间计算为毫秒存入listLyricsTime,将内容存入listLyricsText。

bool Lyrics::analysisLyricsFile(QString line)
{
   
   
    if(line == NULL || line.isEmpty()){
   
   
        qDebug()<<"thie line is empty!";
        return false;
    }
    QRegularExpression regularExpression("\\[(\\d+)?:(\\d+)?(\\.\\d+)?\\](.*)?");
    int index = 0;
    QRegularExpressionMatch match;
    match = regularExpression.match(line, index);
    if(match.hasMatch()) {
   
   
        int totalTime;
        totalTime = match.captured(1).toInt() * 60000 + match.captured(2).toInt() * 1000;                    /*  计算该时间点毫秒数            */
        QString currentText =QString::fromStdString(match.captured(4).toStdString());      /*   获取歌词文本*/
        listLyricsText.push_back(currentText);
        listLyricsTime.
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值