我有一个沉重的QString
。
我需要将其显示为输出。
我尝试了QTextEdit
或QTextBrowser
。以及设置setText
,append
,setPlainText
等文字的所有方法......表现非常糟糕。最烦人的事情是在用户界面上设置东西意味着阻塞主线程。因此,程序在此过程中将无法响应。
有没有更好的方法来显示可视文本结果?
答案 0 :(得分:0)
最好的方法是将文本部分加载为后台操作,并使用线程定期发送信号以重绘GUI,或者更好:只使用QTimer
。
加载前N行,然后启动QTimer
,它将读取小部件中的更多行和append
文本。到达eof后就杀了那个计时器。
我相信example会有所帮助。
答案 1 :(得分:0)
至少如果文档是富文本格式,每次您附加到文档时,显然都会对其进行重新解析。
这是一个性能更高的功能:如果您希望每个附件真正快速且独立地显示(而不是等到它们全部都显示出来之后再显示),则需要访问内部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支付了此建议的费用,但这似乎太愚蠢了,我认为这应该是更常见的知识。)
原始答案here。
答案 2 :(得分:0)
遇到同样的问题,解决方法非常简单!无需创建文档+立即将其添加到QTextBrowser / QTextEdit中,然后使用光标/设置文本进行修改,只需将文档设置为小部件,直到您设置文本/设置格式后...就可以了。