【问题标题】:Incremental Loading in QScintilla ObjectQScintilla 对象中的增量加载
【发布时间】:2016-10-11 03:41:18
【问题描述】:

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

【问题讨论】:

    标签: qt qscintilla


    【解决方案1】:

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

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

    最终答案

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

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

    将以上内容映射到QScintillaBase 作为测试应该很简单。

    【讨论】:

    • 据我所知,我使用 QScintillaBase 类的对象,在这个对象中我应该完成最终答案的所有 1 ,2 ,3 步骤。由于我对 QScintillaBase ,QScintilla 非常陌生,如果您可以使用最终答案中提到的上述方法向我指出示例示例
    • 今天才知道QScintilla/Scintilla!我知道的比你还少。我的意思是,如果您尝试我的建议,这似乎是可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    相关资源
    最近更新 更多