我有一个沉重的QString
.
我需要将其显示为输出。
我尝试了两者QTextEdit
或QTextBrowser
。以及所有设置文本的方法,如,,setText
......性能真的很差。最烦人的是在用户界面上设置东西意味着阻塞主线程。因此程序将在此过程中变得无响应。append
setPlainText
有没有更好的方法来显示视觉文本结果?
我有一个沉重的QString
.
我需要将其显示为输出。
我尝试了两者QTextEdit
或QTextBrowser
。以及所有设置文本的方法,如,,setText
......性能真的很差。最烦人的是在用户界面上设置东西意味着阻塞主线程。因此程序将在此过程中变得无响应。append
setPlainText
有没有更好的方法来显示视觉文本结果?
至少如果文档是富文本,每次您附加到文档时,显然都会重新解析它。
这是一个更高的性能:如果您希望每个附加实际上快速且单独显示(而不是等到它们都被附加后才显示),您需要访问内部 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 行为的合理默认值。
这实际上似乎是 Qt 中的一种陷阱。我会知道为什么 QTextEdit 中没有直接的 fastAppend 方法?或者这个解决方案有警告吗?
(我的公司实际上向 KDAB 支付了这个建议,但这似乎很愚蠢,我认为这应该是更普遍的知识。)
原始答案在这里。
刚遇到同样的问题,解决方法很简单!与其创建文档 + 立即将其添加到 QTextBrowser/QTextEdit 然后使用光标/设置文本来修改它,不如将文档设置为小部件,直到您设置文本/格式之后......一个完整的生活改变者:)
最好的方法是将文本部分加载为后台操作,使用定期发出信号以重绘 GUI 的线程,或者更好:只需使用QTimer
. 加载前 N 行,然后开始QTimer
读取append
小部件内的更多行和文本。达到 eof 后,只需终止该计时器。
我相信这个例子会有所帮助。