2016-06-10 42 views
1

我正在使用QScintilla的对象,并且我正在逐步读取QScintilla对象中的文件。QScintilla对象中的增量加载

页眉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文件的大小为512MB(在同一台机器上)的10秒

有没有什么办法可以根据滚动条的移动递增地加载QScintilla对象中的文件?

回答

1

我发现你的问题很有趣,所以你代表一些谷歌搜索。在我看来,尽管Scintilla通过Loader interface公开了这个功能,但实际上QScintilla类没有。要做到这一点,看起来你需要做的是使用QScintillaBase类将SCI_CREATELOADER消息发送给Scintilla控件。

编辑:此外,你不想在循环中使用append。这会导致各种可怕的事情发生。它可能会强制渲染,某种索引等等。在使用我的建议之前,我建议你在内存中建立一个巨大的QString,然后在最后设置它。更好地预先分配。这可能会更快一点。

最终答案

编辑#2:OK,这是困扰我,像Scintilla的这样一个工业强度的编辑器组件不支持它,但是似乎这样做的正确方法是使用的功能组合:

  1. 开始时你的文档使用SCI_ALLOCATE其中的字节数是您的文件的大小
  2. 你听的SCN_UPDATEUI事件
  3. 0123分配
  4. 然后,根据其中用户被滚动到,则加载该数据

它应该是简单的上述映射到QScintillaBase作为测试。

+0

据我所知,我使用了QScintillaBase类的对象,并且在这个对象的内部,我应该使用最终答案的所有1,2,3步骤。由于我对QScintillaBase,QScintilla非常陌生,如果你能指出我使用上述方法的示例示例,就像你在最终答案 – TechEnthusiast

+0

中提到的那样,我今天才知道QScintilla/Scintilla!我知道甚至比你还少。我只是说,如果你尝试我的建议,看起来可能。 – cheez