在QTextEdit中有一个陷阱,可以简单地使用append()将文本附加到后面。但是,如果文档是富文本格式,则每次您附加到文档时,显然都会对其进行重新解析。
如果您将编辑框用作日志窗口,并且由于外部信号而连续快速附加文本,则附加可以轻松挂起您的应用,而不会显示中间附加,直到每个附加完成为止。
如何在不降低整个UI速度的情况下将丰富文本添加到QTextEdit?
答案 0 :(得分:2)
如果您希望每个附件真正快速且独立地显示(而不是等到它们全部都显示出来之后再显示),则需要访问内部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());
}
滚动到底部是可选的,但在日志记录中使用时,这是UI行为的合理默认值。
此外,如果您的应用程序同时执行许多其他处理,则在fastAppend末尾附加此内容,将优先考虑实际使消息尽快显示:
//show the message in output right away by triggering event loop
QCoreApplication::processEvents();
这实际上似乎是Qt中的一种陷阱。我知道为什么QTextEdit中没有直接的fastAppend方法吗?还是对此解决方案有警告?
(我的公司实际上是向KDAB支付了此建议的费用,但这似乎太愚蠢了,我认为这应该是更常见的知识。)