倾绪 2025-07-07 09:53 采纳率: 100%
浏览 11
已结题

qt歌词滚动,找不到问题在哪

找了很多帖子,但是歌词还是滚动不起来,希望有空帮忙看看哪有问题,本人刚学代码,找了两三天都没找到问题。
我想要做一个当点击播放按钮的时候,定时器开始计时,每一秒都与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);
}
  • 写回答

7条回答 默认 最新

  • 倾绪 2025-07-08 14:32
    关注

    我找到问题在哪了,是时间搞错单位啦

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

问题事件

  • 系统已结题 7月16日
  • 已采纳回答 7月8日
  • 创建了问题 7月7日