QTextEdit или проблема производительности QTextBrowser

У меня тяжелый QString,

Мне нужно отобразить это как вывод.

Я пробовал оба QTextEdit или же QTextBrowser, И все способы настройки текста вроде setText, append, setPlainText..... Производительность действительно плохая. Самое неприятное, что установка в пользовательском интерфейсе означает блокировку основного потока. Таким образом, программа перестает отвечать на запросы в процессе.

Есть ли лучший способ отобразить визуальный текстовый результат?

1 ответ

Решение

Лучше всего было бы частично загрузить текст в качестве фоновой операции с потоком, который периодически посылает сигнал для перерисовки графического интерфейса, или лучше: просто используйте QTimer, Загрузите сначала N строк, а затем начните QTimer это будет читать больше строк и append текст внутри виджета. После достижения цели просто убейте этот таймер.

Я считаю, что этот пример может быть полезным.

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

Это НАМНОГО более производительно: если вы хотите, чтобы каждое добавление действительно отображалось быстро и отдельно (вместо того, чтобы ждать, пока все они будут добавлены, прежде чем они будут показаны), вам нужно получить доступ к внутреннему 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());
}

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

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

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

Оригинальный ответ здесь.

Просто возникла такая же проблема, и разрешение очень простое! Вместо того, чтобы создавать документ + сразу же добавлять его в QTextBrowser/QTextEdit, а затем использовать курсор / установить текст для его изменения, просто отложите установку документа в виджет до ПОСЛЕ того, как вы установите текст / форматирование... полное изменение жизни:)

Другие вопросы по тегам