如何快速向QTextEdit追加文本

4
我有一个应用程序,其中包含某种日志查看器,需要能够实时渲染插入其中的格式化日志记录。
我正在使用Qt编写代码,到目前为止,我一直在使用QTextEdit来呈现文本,该文本使用一些html标记进行美化,然后使用setHtml或insertHtml插入。
问题是,这些函数非常消耗CPU,运行时间很长,会导致整个应用程序挂起。
类似的问题已经在这里提出过:QTextEdit.insertHtml() is very slow 除了说明它真的很慢之外,它没有真正有用的答案,实际上它问的是不同的问题。如果可能的话,我不需要加速setHtml或insertHtml。我愿意使用完全不同的技术。
在Qt中是否有任何机制可以快速插入文本?或者甚至是完全不同于QTextEdit的组件?
是否有任何方法可以追加新行到包含丰富文本(以任何方式生成)的QTextEdit中,而速度非常快?
我还注意到了QTextBrowser,但它似乎只是TextEdit的扩展,它可能更快吗?

你尝试过将 QPlainTextEditQSyntaxHighlighter 结合使用吗?我没有尝试过,只是在搜索解决方案时偶然发现它(请参见:https://dev59.com/gmQm5IYBdhLWcg3wowIF#17466240)。 - Simon Kraemer
append 函数被调用的频率是多少?如果它比屏幕渲染速度更快(比如说大约 60 帧每秒),最好将数据缓存起来,以较慢的速率使用缓存数据调用 append 函数。 - TheDarkKnight
大约每秒1行,这已经足以让Intel i5卡顿,特别是当文本编辑器中有超过500行时。(每秒调用一次setHtml()需要约8秒钟,如果我改用insertHtml(),我需要调用toPlainText()函数,以便查看文本中有多少个字符,以便将其附加到文档末尾,而该函数也需要约8秒钟,所以它们的速度几乎相同。) - Petr
3个回答

4
你应该尝试使用QPlainTextEdit。它使用与QTextEdit相同的技术,但速度更快。它针对纯文本处理进行了优化,但不要被这个迷惑,它仍然具有使用HTML进行基本格式支持的功能。你可以使用appendHtml()附加HTML格式化文本。

2
Qt总是用愚蠢的控件命名让我感到惊讶 :) - Petr
另一个不太明显的功能:这个东西还可以处理自动滚动,这非常好。 - Petr
是的,在这种情况下,QPlainTextEdit的名称完全具有误导性。 - Daniel Hedberg

2
在我的应用程序中,我还需要显示一个大的任务日志,大约有3500行。其中一些行需要着色。为此,我使用了HTML格式。当我使用QTextEdit.setHtml处理这么多文本时,我的GUI会冻结。
我将QTextEdit替换为QListWidget,对于日志的每一行都创建了一个QListWidgetItem
这样做后,它开始运行得更快,没有冻结现象。
而且,我通过使用QListWidgetItem.setForeground保存了着色的文本。

什么是 setForeground - eyllanesc
当然,QListWidgetItem.setForeground。谢谢! - Mikhail Korovkin

0

[这篇文章][1]

[1]: 在Qt中高效地将(富)文本附加到QTextEdit或QTextBrowser包含了解决此问题的答案。要点是:不要简单地附加HTML片段,而是直接操作底层文档。

然而,我建议如果您的显示确实是单行列表,则创建一个QAbstractListModel QAbstractTableModel派生类,并在项目视图中显示它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接