找了很多帖子,但是歌词还是滚动不起来,希望有空帮忙看看哪有问题,本人刚学代码,找了两三天都没找到问题。
我想要做一个当点击播放按钮的时候,定时器开始计时,每一秒都与map的key值去比较,map存放的是歌词和时间,时间为key,歌词为value,当时间与key相同的时候,key对应的value变红,字体变大,或者刚开始让光标指向开头,每一次key值相等就让光标往下挪一行,类似歌词滚动的效果。我用到的显示歌词的控件时textedit。
这是我写的滚动函数:
void MainWindow::rolling()
{
dangqiantime=dangqiantime+100;
QTextCursor cursor=ui->textEdit->textCursor();
cursor.movePosition(QTextCursor::Start);
QMap<qint64, QString>::iterator it = map.lowerBound(dangqiantime);
if(it != map.begin() && it != map.end()){
it--;
cursor.movePosition(QTextCursor::Start);
int lineCount = 0;
for (QMap<qint64, QString>::iterator i = map.begin(); i != it; ++i) {
cursor.movePosition(QTextCursor::Down);
lineCount++;
}
cursor.movePosition(QTextCursor::StartOfLine);
cursor.movePosition(QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
QTextCharFormat highlightFormat;
highlightFormat.setFontPointSize(30);
highlightFormat.setForeground(Qt::red);
cursor.setCharFormat(highlightFormat);
// 滚动到当前行
if (lineCount > ui->textEdit->height() / 60) { // 当行数超过可见区域一半时滚动
cursor.movePosition(QTextCursor::StartOfLine);
ui->textEdit->setTextCursor(cursor);
}
}
}
这个是按钮,计时器在这做的开始一秒
void MainWindow::on_tingbutn_clicked()
{
readfilelrc();
timer_rooling->start(100);
if(media->state()==QMediaPlayer::PlayingState){
media->pause();
ui->tingbutn->setIcon(QIcon(":/icon/imgs/bofang.png"));
}else{
media->play();
ui->tingbutn->setIcon(QIcon(":/icon/imgs/ting.png"));
}
}
这是用到类的私有对象:
QMap<qint64,QString> map;
QTimer *timer_rooling;
这个是一个全局变量,是用来记录时间的
qint64 dangqiantime=0;
这个是在初始化的时候就定义的定时器和槽函数
timer_rooling=new QTimer(this);
connect(timer_rooling,&QTimer::timeout,this,&MainWindow::rolling);
这个是处理歌词的函数
void MainWindow::readfilelrc()
{
ui->textEdit->setStyleSheet("font-size: 24pt; color: yellow;"
"background-color:transparent;");
QTextCharFormat format;
format.setFontPointSize(24); // 设置字体大小
format.setForeground(Qt::yellow); // 设置文本颜色为黄色
QTextCursor cursor = ui->textEdit->textCursor();
cursor.select(QTextCursor::Document); // 选中整个文档
cursor.mergeCharFormat(format);
ui->textEdit->setAlignment(Qt::AlignCenter);
QFile file("E:\\qt\\Lyrics_Player\\geci\\简单爱.lrc");
if(!file.open(QIODevice::ReadOnly|QIODevice::Text)){
QMessageBox::warning(this,"歌词文件","歌词文件打不开");
return;
}
QTextStream steam(&file);
steam.setCodec("utf-8");
QString all_text=steam.readAll();
file.close();
QStringList lrclist=all_text.split("\n");
QRegExp rx("\\[\\d{2}:\\d{2}\\.\\d{2}\\]");
foreach(QString oneline, lrclist) {
QString temp = oneline;
temp.replace(rx, "");
int pos = rx.indexIn(oneline, 0);
while (pos != -1) { //表示匹配成功
QString cap = rx.cap(0);
QRegExp regexp;
regexp.setPattern("\\d{2}(?=:)");
regexp.indexIn(cap);
int minute = regexp.cap(0).toInt();
//秒
regexp.setPattern("\\d{2}(?=\\.)");
regexp.indexIn(cap);
int second = regexp.cap(0).toInt();
//转换成毫秒
qint64 totalTime = minute * 60 + second;
// 插入到lrc_map中
map.insert(totalTime, temp);
pos += rx.matchedLength();
pos = rx.indexIn(oneline, pos);
}
}
foreach (const qint64 &key, map.keys()) {
ui->textEdit->append(map.value(key));
ui->textEdit->setAlignment(Qt::AlignCenter);
}
ui->textEdit->verticalScrollBar()->setValue(0);
}