一、前言
在用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.

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





