【问题标题】:How to fast append to QTextEdit如何快速附加到 QTextEdit
【发布时间】:2016-02-03 21:28:04
【问题描述】:

我有一个具有某种日志查看器的应用程序,它需要能够呈现实时插入其中的格式化日志记录。

我在 Qt 中编写此代码,到目前为止,我使用 QTextEdit 来呈现文本,使用一些 html 标记对其进行美化,然后使用 setHtmlinsertHtml 插入。

但问题是,这些函数非常耗费 CPU,并且运行时间很长,导致整个应用程序挂起。

这里提出了类似的问题:QTextEdit.insertHtml() is very slow

除了说它真的很慢之外,它没有真正有用的答案,它实际上问的是不同的事情。我不需要加速setHtmlinsertHtml。如果可能,我愿意使用完全不同的技术。

Qt 中是否有任何机制可以真正快速地插入文本?或者甚至可能与QTextEdit 完全不同的组件?

有什么方法可以在QTextEdit 中添加新行,其中包含非常快的富文本(以任何方式生成)?

我也注意到QTextBrowser,但它似乎只是 TextEdit 的扩展,会不会更快?

【问题讨论】:

  • 您是否尝试过将QPlainTextEditQSyntaxHighlighter 结合使用?没有尝试过 - 只是在寻找解决方案时偶然发现它(另请参阅:stackoverflow.com/a/17466240/4181011
  • append 被调用的频率是多少?如果它比屏幕渲染更快(比如说每秒 60 帧),你最好缓冲数据并使用缓冲区调用 append,速度较慢。
  • 每秒大约 1 行,这已经足够用包含超过 500 行的 textedit 挂起 intel i5。 ( setHtml() 调用大约需要 8 秒,每 1 秒调用一次,如果我使用 insertHtml() 代替,我需要调用 toPlainText() 以便我可以看到文本有多少符号才能附加到末尾文档,这个函数也需要大约 8 秒,所以它是一样的。

标签: c++ qt


【解决方案1】:

你应该试试QPlainTextEdit。它使用与QTextEdit 相同的技术,但速度要快得多。它针对纯文本处理进行了优化,但不要让它愚弄你,它仍然对使用 HTML 进行格式化提供一些基本支持。您可以使用appendHtml() 附加 HTML 格式的文本。

【讨论】:

  • Qt 从来没有因为它们的控件的愚蠢命名而让我感到惊讶 :)
  • 另一个不明显的功能:这个东西还可以自己处理自动滚动,这很棒
  • 是的,在这种情况下 QPlainTextEdit 这个名字完全是误导性的。
【解决方案2】:

在我的应用程序中,我还需要显示大量的任务日志,大约 3500 行。日志的某些行应该是彩色的。为此,我使用了 HTML 格式。 QTextEdit.setHtml 有这么多文字,冻结了我的 GUI。

我将QTextEdit 替换为QListWidget,其中QListWidgetItem 为日志的每一行创建。

它开始工作得更快,没有带状饰带。

我保存了彩色文本,使用 QListWidgetItem.setForeground 很简单。

【讨论】:

  • 什么是setFreground
  • QListWidgetItem.setForeground 当然。谢谢!
【解决方案3】:

[这篇文章][1]

[1]:Performantly appending (rich) text to QTextEdit or QTextBrowser in Qt 包含此问题的答案。要点:不是简单地附加一个 HTML sn-p,而是直接操作底层文档。

但是,我建议如果您的显示确实是单行列表,您可以创建一个 QAbstractListModel QAbstractTableModel 派生类并将其显示在项目视图中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-18
    • 2014-07-22
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2015-08-20
    • 2019-11-20
    • 1970-01-01
    相关资源
    最近更新 更多