1

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

有什么方法可以根据滚动条的移动增量加载 QScintilla 对象中的文件?

4

1 回答 1

1

我发现您的问题很有趣,因此代表您进行了一些谷歌搜索。在我看来,虽然 Scintilla 通过Loader 接口公开了此功能,但实际上QScintilla该类没有。要完成这项工作,您似乎需要做的是使用QScintillaBase该类将SCI_CREATELOADER消息发送到 Scintilla 控件。

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

最终答案

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

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

将上述内容映射为测试应该很简单QScintillaBase

于 2016-06-10T12:09:43.027 回答