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, а затем использовать курсор / установить текст для его изменения, просто отложите установку документа в виджет до ПОСЛЕ того, как вы установите текст / форматирование... полное изменение жизни:)