如何在Qt Project中打包大数据?

How to package large data in a Qt Project?

我正在开发一个包含大型数据集 (70Mb+) 的 Qt 项目。

数据将由使用数据路径访问数据的库使用。

我知道我可以正常使用资源,但是因为它们在内存对象中,所以我不能在库中使用它们。

所以我的问题是,我如何打包文件或文件夹,以便在 installation/runtime 上可供任何人访问?

资源在进程的内存中可用,因此在您的进程中使用的任何库也可以访问它们。只需使用 QResource class 找出资源的地址和大小,并将其传递给图书馆。

如果库不能获取数据的指针和大小,而是坚持要一个文件,你可以使用QResourceQTemporaryFileQFile::copy来转储将可执行文件中的数据存入临时文件,以便库可以使用。

图书馆应该有两种接受数据的方式:

  1. 进程内数据:地址+大小。例如

    setData(void * address, int size);
    
  2. 进程外数据:文件路径+偏移量+大小。

    setData(const char * filePath, void * offset = 0, int size = -1);
    // size = -1 uses the entire file
    

这将使图书馆能够:

  1. 使用进程内存中可用的二进制资源,无论它们来自 QResource 或 WINAPI 资源,还是从网络下载后保存在临时缓冲区中等

  2. 使用文件中可用的二进制资源,包括 Qt 和 Windows 在可执行文件本身的偏移处可用的资源。

因此,在花费更多时间进行 Qt 和 C++ 开发之后,一般来说您根本不需要 Qt 来实现此功能。

您需要修改您的构建过程,以便在构建完成后将您需要的文件与二进制文件一起发送。

好消息是使用 cmake 非常简单。

在构建执行此操作的 cmake 代码后,只需将您希望在运行时可用的任何文件复制到输出目录即可:

 add_custom_command(TARGET ${PROJECT} POST_BUILD
                   COMMAND ${CMAKE_COMMAND} -E copy_directory
                       ${RES_DIR} $<TARGET_FILE_DIR:${PROJECT}>/RES/)

其中 PROJECT 是目标的名称。

RES_DIR: 资源目录的完整路径。