Сборка QML-приложения с помощью CMake
В разделе Сборка консольного приложения C++ мы показали файл CMakeLists.txt для простого консольного приложения. Теперь мы расширим его, чтобы создать приложение QML, использующее модуль Qt Quick.
Это полный файл проекта:
cmake_minimum_required(VERSION 3.16)
project(hello VERSION 1.0 LANGUAGES CXX)
set(CMAKE_AUTOMOC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt6 6.2 COMPONENTS Quick Gui REQUIRED)
qt_add_executable(myapp
main.cpp
)
qt_add_qml_module(myapp
URI hello
VERSION 1.0
QML_FILES
main.qml
FramedImage.qml
RESOURCES
img/world.png
)
target_link_libraries(myapp PRIVATE Qt6::Gui Qt6::Quick)
Давайте пройдемся по внесенным нами изменениям. Мы указываем CMAKE_AUTOMOC, CMAKE_CXX_STANDARD и CMAKE_CXX_STANDARD_REQUIRED.
set(CMAKE_AUTOMOC ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
В вызове find_package мы заменяем Core на Quick. Это найдет модуль Qt6Quick и предоставит цели Qt6::Quick, с которыми мы позже свяжемся.
find_package(Qt6 6.2 COMPONENTS Quick Gui REQUIRED)
Обратите внимание, что приложение по-прежнему будет связываться с Qt6::Core, потому что Qt6::Quick зависит от него.
qt_add_executable создает и дорабатывает цель приложения:
qt_add_executable(myapp
main.cpp
)
qt_add_qml_module передает цель исполняемого файла, URI, версию модуля и список файлов QML, чтобы гарантировать, что myapp станет модулем QML. Среди прочего, она помещает файлы QML в qrc:/${URI} в файловой системе ресурсов.
qt_add_qml_module(myapp
URI hello
VERSION 1.0
QML_FILES
main.qml
FramedImage.qml
RESOURCES
img/world.png
)
Во-первых, qt_add_qml_module обеспечивает запуск qmlcachegen. Во-вторых, создается цель myapp_qmllint, которая запускает qmllint для файлов в QML_FILES.
При добавлении ресурсов, на которые есть ссылки, они автоматически добавляются в приложение по тому же корневому пути, что и файлы QML, – также в файловой системе ресурсов. Поддерживая путь в системе ресурсов в соответствии с путем в исходном каталоге и каталоге сборки, мы гарантируем, что изображение всегда будет найдено, поскольку оно разрешается относительно FramedImage.qml. Это относится к образу в файловой системе ресурсов, если мы загружаем оттуда main.qml, или к изображению в реальной файловой системе, если мы просматриваем его с помощью инструмента qml.
В команде target_link_libraries мы линкуемся с Qt6::Quick вместо Qt6::Core.
target_link_libraries(myapp PRIVATE Qt6::Gui Qt6::Quick)
