QPlainTextEdit 显示性能缓慢

Lev*_*nte 5 c++ performance qt

我在 Qt 中创建了一个特殊的文件查看器工具来显示大约 1-30 MB 的文本数据。

QPlainTextEdit在只读模式下使用禁用自动换行来显示文本。

我有一个 20MByte 的示例文件,调用QPlainTextEdit::setPlainText()大约需要 6.5 秒,这对于想要经常使用这个工具的我来说是不可接受的。

使用 Notepad++ 或 TotalCommander 的 Lister 打开同一个文件需要花费难以察觉的时间(远小于一秒)。

你知道我该如何解决这个问题吗?

这种编辑器类型可以改进吗?

有没有其他文本查看器类可以更快地完成?

是否可以创建自己的文本查看器类来提高性能?

Waq*_*med 2

我不确定我的回答会有多大帮助(大部分是基于个人经验)。

这种编辑器类型可以改进吗?

您无法提高 的性能setPlainText(),但您可以尝试改进突出显示机制,这将带来更好的性能。

QPlainTextEdit::setPlainText()是一个在编辑器中设置纯文本的简单界面,但在幕后它会执行一些其他操作,例如语法突出显示,这会显着降低性能,因为highlightBlock()文件中的每个文本块都会被调用。因此,如果文本文件中有 100 万行,则将有 100 万次调用highlightBlock(). 这会影响性能,并且没有办法“轻松”解决这个问题。

我见过的大多数编辑器都使用正则表达式来解析当前文本块,然后突出显示它。提高性能的第一步可能是用手动解析替换正则表达式。我已经尝试过多次,它总是会带来更好的性能。

另一种不太常见的方法是使用多线程进行突出显示。您可以获取文件中的所有文本并将其发送给“荧光笔工作人员”,并让它在后台进行突出显示。您可以在此处此处查看此操作的实际情况。

是否还有其他文本查看器类可以更快地完成此操作?

您可以尝试Scintilla,这是 Notepad++ 使用的。它可以与 Qt C++ 集成并且工作得很好。有一些 Qt 应用程序正在使用它,其中一个例子是textosaurus

是否可以创建自己的文本查看器类来提高性能?

是的,但这将是一项艰巨的任务。请阅读上面@Vasilij 的回答。