如何在Qt项目中打包大数据

How to package large data in a Qt Project?

本文关键字:包大 数据 项目 Qt      更新时间:2023-10-16

我正在做一个Qt项目,其中包括一个大型数据集(70Mb+)。

数据将被通过数据路径访问它们的库使用。

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

所以我的问题是,我如何包装一个文件或文件夹,使它可以在安装/运行时供任何人访问?

这些资源在进程的内存中可用,因此进程中使用的任何库都可以访问它们。只需使用QResource类查找资源的地址和大小,并将其传递给库。

如果库不能接受指针和数据的大小,但坚持一个文件,你可以使用QResource, QTemporaryFileQFile::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:资源目录的全路径