【问题标题】:QTextEdit or QTextBrowser performance issueQTextEdit 或 QTextBrowser 性能问题
【发布时间】:2016-02-18 15:40:17
【问题描述】:

我有一个沉重的QString

我需要将其显示为输出。

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

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

【问题讨论】:

    标签: qt qtextedit qplaintextedit


    【解决方案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 支付了费用,但这似乎很愚蠢,以至于我认为这应该是更普遍的知识。)

    原答案here

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 除非你确实需要在显示后多次修改文档,当然:)
      【解决方案3】:

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

      我相信example 会有所帮助。

      【讨论】:

      • 酷。答案简单而准确。
      • 示例链接已损坏。有人可以将一些代码内联到答案中吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-27
      • 2022-01-04
      • 2018-01-09
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多