QTextEdit或QTextBrowser性能问题

时间:2015-11-17 10:03:08

标签: qt qtextedit qplaintextedit

我有一个沉重的QString

我需要将其显示为输出。

我尝试了QTextEditQTextBrowser。以及设置setTextappendsetPlainText等文字的所有方法......表现非常糟糕。最烦人的事情是在用户界面上设置东西意味着阻塞主线程。因此,程序在此过程中将无法响应。

有没有更好的方法来显示可视文本结果?

3 个答案:

答案 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中,然后使用光标/设置文本进行修改,只需将文档设置为小部件,直到您设置文本/设置格式后...就可以了。