Безупречно добавлять (обогащенный) текст в QTextEdit или QTextBrowser в Qt - PullRequest
0 голосов
/ 03 февраля 2019

В QTextEdit есть небольшая ловушка, которую можно добавить к тексту просто с помощью append ().Однако, если документ представляет собой форматированный текст, каждый раз, когда вы добавляете его в документ, он, очевидно, обрабатывается повторно.

Если вы используете поле редактирования в качестве окна журнала и добавляете текст в виде последовательных последовательностей в результатевнешние сигналы, добавление может легко повесить ваше приложение без промежуточных добавлений, отображаемых до тех пор, пока каждое из добавлений не завершится.

Как добавить расширенный текст в QTextEdit без замедления всего пользовательского интерфейса?

1 Ответ

0 голосов
/ 03 февраля 2019

Если вы хотите, чтобы каждое добавление действительно отображалось быстро и отдельно (вместо того, чтобы ждать, пока все они будут добавлены, прежде чем они будут показаны), вам нужно получить доступ к внутреннему QTextDocument:

void fastAppend(QString message,QTextEdit *editWidget)
{
    const bool atBottom = editWidget->verticalScrollBar()->value() == editWidget->verticalScrollBar()->maximum();
    QTextDocument* doc = editWidget->document();
    QTextCursor cursor(doc);
    cursor.movePosition(QTextCursor::End);
    cursor.beginEditBlock();
    cursor.insertBlock();
    cursor.insertHtml(message);
    cursor.endEditBlock();

    //scroll scrollarea to bottom if it was at bottom when we started
    //(we don't want to force scrolling to bottom if user is looking at a
    //higher position)
    if (atBottom) {
        scrollLogToBottom(editWidget);
    }
}

void scrollLogToBottom(QTextEdit *editWidget)
{

    QScrollBar* bar =  editWidget->verticalScrollBar();
    bar->setValue(bar->maximum());
}

Прокруткаснизу необязательно, но при ведении журнала это разумное значение по умолчанию для поведения пользовательского интерфейса.

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

    //show the message in output right away by triggering event loop
    QCoreApplication::processEvents();

Это на самом делекажется своего рода ловушкой в ​​Qt.Я хотел бы знать, почему нет метода fastAppend непосредственно в QTextEdit?Или есть какие-то предостережения для этого решения?

(Моя компания фактически заплатила KDAB за этот совет, но это кажется настолько глупым, что я подумал, что это должно быть более распространенным знанием.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...