我在Qt中创建了一个特殊的文件查看器工具,用于在1-30 MBytes左右显示文本数据。
我在只读模式下使用QPlainTextEdit并禁用了单词包装来显示文本。
我有一个20 20MByte示例文件,QPlainTextEdit::setPlainText()的调用大约需要6.5秒,这是我无法接受的,我很想经常使用这个工具。
用Notepad++或Total指挥官的Lister打开相同的文件需要一段不可察觉的时间(远远少于一秒钟)。
你知道我该怎么解决这个问题吗?
这个编辑器类型能改进它吗?
还有其他文本查看器类可以更快地完成吗?
是否可以创建自己的文本查看器类以提高性能?
发布于 2020-07-28 08:02:40
我不知道我的答案会有多大帮助(大部分是基于个人经验)。
这个编辑器类型能改进它吗?
您不能提高setPlainText()的性能,但是您可以尝试改进突出显示机制,从而提高性能。
QPlainTextEdit::setPlainText()是一个简单的界面,可以在编辑器中设置纯文本,但在幕后,它会执行其他一些操作,比如语法突出显示,这会明显降低性能,因为文件中的每个文本块都会调用highlightBlock()。因此,如果文本文件中有100万行,就会有100万次对highlightBlock()的调用。这会影响性能,而且没有办法“轻松”地绕过这一问题。
我见过的大多数编辑器都使用正则表达式来解析当前文本块,然后突出显示它。提高性能的第一步可以是用手动解析替换正则表达式。我已经尝试过多次,它总是能带来更好的性能。
另一种非常少见的方法是使用多线程来突出显示。您可以获取文件中的所有文本,并将其发送给“荧光工作者”,并让它在后台进行高亮显示。您可以在实际的这里和这里中看到这一点。
还有其他文本查看器类可以更快地完成吗?
您可以尝试Scintilla,这是Notepad++所使用的。它可以与Qt C++集成,并且工作得很好。有几个Qt应用程序正在使用它,其中一个例子是文字龙。
是否可以创建自己的文本查看器类以提高性能?
是的,但那将是一项艰巨的任务。请阅读上面@Vasilij的回答。
发布于 2020-07-28 06:04:55
QPlainTextEdit是慢的。它的目的是显示不太大的文本块,不超过100万行非常粗略,甚至更少取决于你的平台。
已知的解是基于模型的。使用快速C++模型和类似于QListView (或QML ListView)的东西,只显示可见的行。每次收到来自滑块、车轮、键盘的事件时,请更新视图。就像QTableView一样。或者,如果需要颜色和一些特殊的格式,比如行号或图标,也可以使用QPainter手动绘制视图。
很容易创建一个简单的只读日志视图,比如小部件。创建编辑器是一项艰巨的任务,因为您必须处理选择、删除、复制粘贴和其他不是手动处理的问题。
https://stackoverflow.com/questions/63127788
复制相似问题