Qt - Undocumented QMake - Copying Files

undocumented, Qt, QMake


Qt is quite a large framework and it constantly introduces functionality, which unfortunately either do not have time to document or forget to document.

For example, besides the QQuickItem documentation, I highly recommend watching the sources, or at least the header files. Wonder how many public methods are there that are not described in the documentation, but can be successfully applied, and are very useful in a word.

But now the talk will be about copying files using the functionality that was implemented in Qt 5.6, but at the same time almost nothing is known about it.


I already implemented copying files using QMAKE_EXTRA_TARGETS when developing an installer project on QtIFW , which is often advised in various forums.

And this is how the code for copying files looked.

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
# 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

Quite a monstrous solution, especially if you consider that the syntax of QMake itself is so-so. In addition, setting up copying files using this functionality is also a non-trivial task.

Implementation using the undocumented file_copies module

But the undocumented file_copies module makes everything somewhat simpler and, in terms of setting, looks like the INSTALLS setting.

# 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

In this case, we do not need to call the build with the install argument to copy the files as needed for INSTALLS.

That is, we can copy, for example, translation files into the build directory of an exe file to check if the translations work correctly, or something else like that, without full application deployment.


If desired, you can specify the base path to be trimmed from the source path.

translations.base = $$PWD/target_path

Copying one file did not work, that is, if you write like this

translations.files = $$files($$PATH_SRC_ROOT/application_es.qm)

That file was simply not copied. Perhaps on the most recent versions of Qt, it works stably, but with 5.9.3, on which I tested it, did not work.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
Support the author Donate


Only authorized users can post comments.
Please, Log in or Sign up

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

April 9, 2020, 5:41 a.m.

Qt - Test 001. Signals and slots

  • Result:21points,
  • Rating points-10
April 9, 2020, 5:36 a.m.

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:40points,
  • Rating points-8
April 9, 2020, 5:32 a.m.

C++ - Test 001. The first program and data types

  • Result:53points,
  • Rating points-4
Last comments
April 8, 2020, 9:12 a.m.

Круто! Немного начинает проясняться что к чему. Спасибо.
April 7, 2020, 8:55 a.m.

А вот уже и на python... #!/usr/bin/env python# -'''- coding: utf-8 -'''-import sysfrom PySide2.QtWidgets import *from PySide2.QtQuick import *from PySide2.QtCore import *from PySide2.…
April 3, 2020, 8:06 a.m.
Konstantin Grudnitskiy

Я надеюсь вы уже разобрались в чем дело, но если вдруг нет, то проблема состоит в том, что вы пытаетесь запустить программу из интерпретатора питона. Файл main.py это уже готова…
April 3, 2020, 6:18 a.m.
Konstantin Grudnitskiy

>>> text = 'hello world'>>> ' '.join(word for word in text.split()[:-1])'hello'>>> def remove_last_word(text):... return text and ' '.join(word for word in text.s…
March 27, 2020, 2:40 p.m.
Evgenij Legotskoj

Добрый день. В конце пятой статьи скачать можете.
Now discuss on the forum
April 9, 2020, 3:31 a.m.
Dzhon Kofi

Привет. Делаю реализацию перемещения строк на QTableView с моделью QSqlTableModel. Буду в этой теме спрашивать нужное. Пока такой вопрос при создании модели: как мне узнать rowCount? int…
April 8, 2020, 5:42 p.m.

Подскажите как правильно реализовать... Нужно создать массив в C++ с переменными типа сhar или же int. В Qml будет переменная, например text, которая будет изменять своё значение в зависим…
April 8, 2020, 6:29 a.m.
Dzhon Kofi

:-D блин, без слов, пойду пройдусь))
April 8, 2020, 4:59 a.m.

Всем привет. Прошу помощи.есть статическая сборка 5.14.2 (без SSL) компилируется чистый шаблон на QML и Widgets если войти на компьютер в терминальной сессии и запустить программ…
April 6, 2020, 8:06 a.m.

Добрый день. Объясните пожалуйста ... ... допиливать стилевое оформление в прокси классе ... где именно копать ? В каком виртуальном методе лучше допиливать (если можно н…
© EVILEG 2015-2019
Recommend hosting TIMEWEB