QScintilla对象中的增量加载

时间:2016-06-10 08:39:45

标签: qt qscintilla

我正在使用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对象中的文件?

1 个答案:

答案 0 :(得分:1)

我发现你的问题很有趣,所以为你做了一点谷歌搜索。在我看来,虽然Scintilla通过Loader interface公开了这个功能,但实际上QScintilla类没有。为了使这项工作,您似乎必须使用QScintillaBase类将SCI_CREATELOADER消息发送到Scintilla控件。

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

最终答案

编辑#2:好吧,令人困扰的是,像Scintilla这样的工业强度编辑器组件本身并不支持这一点,但似乎正确的方法是使用一组功能:

  1. 您首先使用SCI_ALLOCATE分配的文档,其中字节数是文件的大小
  2. 您正在聆听SCN_UPDATEUI事件
  3. 然后,根据用户滚动到的位置,加载该数据
  4. 将上述内容映射到QScintillaBase作为测试应该是直截了当的。