Сборка 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)