Изменить последнюю строку в QTextBrowser

У меня есть QTextBrowser, который отображает строки QString и Int. Сообщения выглядят примерно так:

Сообщение счетчику 1

Сообщение счетчику 2

Сообщение счетчику 3

Сообщение b счетчик 1

Вместо того, чтобы всегда добавлять новую строку для каждого приращения счетчика, я хочу просто увеличить Int в последнем сообщении (последняя строка). Каков наиболее эффективный способ сделать это?

Я придумал этот код, чтобы удалить только последнюю строку в QTextBrowser:

ui->outputText->append(messageA + QString::number(counter));
ui->outputText->moveCursor( QTextCursor::End, QTextCursor::MoveAnchor );
ui->outputText->moveCursor( QTextCursor::StartOfLine, QTextCursor::MoveAnchor );
ui->outputText->moveCursor( QTextCursor::End, QTextCursor::KeepAnchor );
ui->outputText->textCursor().removeSelectedText();
ui->outputText->append(messageA + QString::number(++counter));

К сожалению, это оставляет мне пустую строку после удаления последней строки, которая выглядит очень уродливо. Каков наилучший способ добиться этого, не требующий очистки всего QTextBroswer и повторного добавления каждой строки.


person testus    schedule 29.12.2014    source источник
comment
Не могли бы вы удалить последнюю строку и добавить ее снова? Я могу дать вам код для этого, если это нормально...   -  person lpapp    schedule 29.12.2014
comment
Да, это то, что я пытаюсь сделать. Как я сделал это в моем примере, у меня осталась пустая строка после удаления последней строки, которая выглядит некрасиво.   -  person testus    schedule 29.12.2014


Ответы (1)


Вот мое решение, но имейте в виду, что для его сборки и запуска требуются как минимум C++ 11 и Qt 5.4. Однако концепция заключается в том, что вы можете копировать и вставлять, не используя QTimer, требуя этих версий выше:

main.cpp

#include <QApplication>
#include <QTextBrowser>
#include <QTextCursor>
#include <QTimer>

int main(int argc, char **argv)
{
    QApplication application(argc, argv);
    int count = 1;
    QString string = QStringLiteral("Message a counter %1");
    QTextBrowser *textBrowser = new QTextBrowser();
    textBrowser->setText(string.arg(count));
    QTimer::singleShot(2000, [textBrowser, string, &count](){
        QTextCursor storeCursorPos = textBrowser->textCursor();
        textBrowser->moveCursor(QTextCursor::End, QTextCursor::MoveAnchor);
        textBrowser->moveCursor(QTextCursor::StartOfLine, QTextCursor::MoveAnchor);
        textBrowser->moveCursor(QTextCursor::End, QTextCursor::KeepAnchor);
        textBrowser->textCursor().removeSelectedText();
        textBrowser->textCursor().deletePreviousChar();
        textBrowser->setTextCursor(storeCursorPos);
        textBrowser->append(string.arg(++count));
    });
    textBrowser->show();
    return application.exec();
}

main.pro

TEMPLATE = app
TARGET = main
QT += widgets
CONFIG += c++11
SOURCES += main.cpp

Построить и запустить

qmake && make && ./main
person lpapp    schedule 29.12.2014
comment
Кажется, единственное, чего мне не хватало, так это textCursor().deletePreviousChar();, чтобы избавиться от пустой строки. Теперь он работает как задумано. Спасибо. - person testus; 29.12.2014
comment
@testus: да, не беспокойся :) - person lpapp; 29.12.2014