我正在使用QScintilla的一个对象,我正在逐步读取QScintilla对象中的文件。
Header myEditor.h
class myScintilla: public QScintilla {
public readFile();
};
#include "myEditor.h"
void myEditor::readFile() {
if (FILE* fp = fopen(ofilename.toLatin1(), "r")) {
QTextStream ts(fp, QIODevice::ReadOnly);
int bufferSize =(1024* 1024)/2;
do {
QString s = ts.read(bufferSize);
append(s);
} while(!ts.atEnd());
}
即使在此更改后,读取大文件时仍会出现性能问题。花了很多时间
1)25秒读取大小为1.5 GB的文件。 (机芯4,16 GB RAM) 2个10秒大小为512MB的文件(在同一台机器上)
有没有办法可以根据滚动条的移动逐步加载QScintilla对象中的文件?
答案 0 :(得分:1)
我发现你的问题很有趣,所以为你做了一点谷歌搜索。在我看来,虽然Scintilla通过Loader interface公开了这个功能,但实际上QScintilla
类没有。为了使这项工作,您似乎必须使用QScintillaBase
类将SCI_CREATELOADER
消息发送到Scintilla控件。
编辑:此外,您不希望在循环中使用append
。这将导致各种可怕的事情发生。它可能会强制渲染,某种索引等。在使用上面的建议之前,我建议您在内存中构建一个巨大的QString,然后在最后设置它。更好地预先分配。这可能会快一点。
最终答案
编辑#2:好吧,令人困扰的是,像Scintilla这样的工业强度编辑器组件本身并不支持这一点,但似乎正确的方法是使用一组功能:
SCI_ALLOCATE
分配的文档,其中字节数是文件的大小SCN_UPDATEUI
事件将上述内容映射到QScintillaBase
作为测试应该是直截了当的。