2

我有一个沉重的QString.

我需要将其显示为输出。

我尝试了两者QTextEditQTextBrowser。以及所有设置文本的方法,如,,setText......性能真的很差。最烦人的是在用户界面上设置东西意味着阻塞主线程。因此程序将在此过程中变得无响应。appendsetPlainText

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

4

3 回答 3

1

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

这是一个更高的性能:如果您希望每个附加实际上快速且单独显示(而不是等到它们都被附加后才显示),您需要访问内部 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 支付了这个建议,但这似乎很愚蠢,我认为这应该是更普遍的知识。)

原始答案在这里

于 2019-02-04T08:39:37.103 回答
1

刚遇到同样的问题,解决方法很简单!与其创建文档 + 立即将其添加到 QTextBrowser/QTextEdit 然后使用光标/设置文本来修改它,不如将文档设置为小部件,直到您设置文本/格式之后......一个完整的生活改变者:)

于 2019-11-15T23:46:36.473 回答
0

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

我相信这个例子会有所帮助。

于 2015-11-17T10:26:11.897 回答