我在Qt中创建了一个特殊的文件查看器工具,以显示大约1-30 MB的文本数据。
我在只读模式下使用QPlainTextEdit
并禁用了自动换行来显示文本。
我有一个20 MB的示例文件,QPlainTextEdit::setPlainText()
的调用大约需要6.5秒,这对于我想经常使用此工具来说是 Not Acceptable 。
使用Notepad++或TotalCommander的Lister打开相同的文件会花费不明显的时间(不到一秒钟)。
你知道我该怎么解决吗?
可以使用此编辑器类型进行改进吗?
是否有其他文本查看器类可以更快地完成此操作?
是否可以创建自己的文本查看器类以提高性能?
最佳答案
我不确定我的答案会有多大帮助(大部分是基于个人经验)。
您无法提高setPlainText()
的性能,但是可以尝试改善突出显示机制,从而提高性能。QPlainTextEdit::setPlainText()
是一个用于在编辑器中设置纯文本的简单界面,但在幕后它还会执行其他一些操作,例如语法突出显示,这会明显降低性能,因为highlightBlock()
将针对文件中的每个文本块进行调用。因此,如果您的文本文件中有100万行,那么将有100万次调用highlightBlock()
。这会影响性能,并且无法“轻松”地解决此问题。
我见过的大多数编辑器都使用正则表达式来解析当前文本块,然后将其突出显示。迈向更好性能的第一步可能是用手动解析替换正则表达式。我已经尝试了多次,它总是可以带来更好的性能。
另一种不常见的方法是使用多线程进行突出显示。您可以获取文件中的所有文本,并将其发送给“突出显示工作人员”,并使其在后台突出显示。您可以在操作here和here中看到它。
您可以尝试 Scintilla ,这是Notepad++所使用的。它可以用Qt C++进行整数运算,并且效果很好。有一些Qt应用程序正在使用它,一个示例是textosaurus。
是的,但这将是一项艰巨的任务。在上面阅读@Vasilij的answer。