Qt достаточно большой фреймворк и в него постоянно внедряют функционал, который к сожалению либо не успевают документировать, либо забывают документировать.
Например, помимо документации QQuickItem, я настоятельно рекомендую посмотреть исходники или хотя бы заголовочные файлы. Интересно, сколько существует публичных методов, которые не описаны в документации, но могут быть успешно применены, и одним словом очень полезны.
Но сейчас речь пойдет о копировании файлов с использованием того функционала, который был реализован в Qt 5.6, но при этом о нем почти ничего не известно.
Преамбула
Я уже реализовал копирование файлов с помощью QMAKE_EXTRA_TARGETS при разработке проекта установщика на QtIFW , что часто советуют на различных форумах.
А вот так выглядел код копирования файлов.
INSTALLER_OFFLINE = $$OUT_PWD/../../InstallerRelease/Hello.offline INSTALLER_ONLINE = $$OUT_PWD/../../InstallerRelease/Hello.online # Set a variable that should contain the path to the data folder DESTDIR_WIN = $$PWD/packages/ru.evileg.helloinstaller/data DESTDIR_WIN ~= s,/,\\,g # We set the path from where all the application with DLLs will need to be copied PWD_WIN = $$OUT_PWD/../../HelloRelease PWD_WIN ~= s,/,\\,g # Before assembling the installers, you must copy the files from the project's output folder along with all the DLLs to the data folder that belongs to the package you are building. copydata.commands = $(COPY_DIR) $$PWD_WIN $$DESTDIR_WIN first.depends = $(first) copydata export(first.depends) export(copydata.commands) # we set a custom build target, in which we first perform file compiling and then the rest, which follows the QMake script QMAKE_EXTRA_TARGETS += first copydata
Довольно монструозное решение, особенно если учесть, что синтаксис самого QMake так себе. К тому же настройка копирования файлов с помощью этого функционала тоже нетривиальная задача.
Реализация с использованием недокументированного модуля file_copies
А вот недокументированный модуль file_copies делает все несколько проще и по настройке похож на настройку INSTALLS.
# Add the file_copies module CONFIG += file_copies # Add a variable that describes the copied files. COPIES += translations # Determine with which extension we need to copy the files and in what way they are located translations.files = $$files($$PATH_SRC_ROOT/*.qm) # Specify the path where to copy files translations.path = $$DESTDIR
В этом случае нам не нужно вызывать сборку с аргументом установки, чтобы скопировать файлы, необходимые для УСТАНОВКИ.
То есть мы можем скопировать, например, файлы переводов в директорию сборки exe-файла, чтобы проверить, правильно ли работают переводы, или еще что-то в этом роде, без полного развертывания приложения.
Примечания
При желании вы можете указать базовый путь, который нужно отделить от исходного пути.
translations.base = $$PWD/target_path
Копирование одного файла не сработало, то есть если писать так
translations.files = $$files($$PATH_SRC_ROOT/application_es.qm)
Этот файл просто не был скопирован. Возможно, на самых последних версиях Qt работает стабильно, а вот с 5.9.3, на которой я тестировал, не заработало.