Как упаковать большие данные в Qt Project?

Я работаю над проектом Qt, который включает в себя большой набор данных (70Mb +).

Данные будут использоваться библиотекой, которая обращается к ним по пути данных.

Я знаю, что могу нормально использовать ресурсы, но так как они находятся в объектах памяти, я не могу использовать их с библиотекой.

Итак, мой вопрос, как я могу упаковать файл или папку, чтобы они были доступны во время установки / выполнения для любого доступа?

1

Решение

Ресурсы доступны в памяти процесса, поэтому любая библиотека, используемая в вашем процессе, также имеет к ним доступ. Просто используйте QResource Класс, чтобы узнать адрес и размер ресурса, и передать его в библиотеку.

Если библиотека не может взять указатель и размер данных, но настаивает на файле, вы можете использовать QResource, QTemporaryFile а также QFile::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, которые доступны со смещением в самом исполняемом файле.

1

Другие решения

Поэтому, потратив больше времени на разработку 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: полный путь к каталогу ресурсов.

0

По вопросам рекламы [email protected]