QTextEdit 或 QTextBrowser 性能问题

QTextEdit or QTextBrowser performance issue

我有一个沉重的QString

我需要将其显示为输出。

QTextEditQTextBrowser 我都试过了。还有setTextappendsetPlainText等各种设置文本的方法……性能真的很差。最烦人的事情是在用户界面上设置意味着阻塞主线程。所以过程中程序会变得无响应。

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

最好的方法是使用定期发射信号重绘 GUI 的线程作为后台操作部分加载文本,或者更好:只需使用 QTimer。 加载前 N 行,然后启动 QTimer 将读取更多行和小部件内的 append 文本。达到 eof 后,只需终止该计时器即可。

我相信 example 会有所帮助。

至少如果文档是富文本,每次附加到文档时,它显然都会重新解析。

这会更高效:如果您希望每个追加实际上快速且单独显示(而不是等到它们全部被追加后再显示),您需要访问内部 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 然后使用 cursor/set 文本修改它,不如将文档设置为小部件,直到您设置文本/格式之后......一个完整的生活改变者:)