2

との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全体をクリアして各行を再度追加することを伴わない、これを達成するための最良の方法は何ですか。

4

1 に答える 1

6

これが私の解決策ですが、ビルドして実行するには、少なくとも 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
于 2014-12-29T14:07:19.623 に答える