Если вы хотите, чтобы каждое добавление действительно отображалось быстро и отдельно (вместо того, чтобы ждать, пока все они будут добавлены, прежде чем они будут показаны), вам нужно получить доступ к внутреннему 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 за этот совет, но это кажется настолько глупым, что я подумал, что это должно быть более распространенным знанием.)