Building a QML application
In Building a C++ console application, we showed the CMakeLists.txt file for a simple console application. We will now create a QML application that uses the Qt Quick module.
Here is the full project file:
cmake_minimum_required(VERSION 3.16)
project(helloworld VERSION 1.0.0 LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(Qt6 6.5 COMPONENTS Quick REQUIRED)
qt_standard_project_setup(REQUIRES 6.5)
qt_add_executable(helloworld
main.cpp
)
qt_add_qml_module(helloworld
URI hello
QML_FILES
main.qml
FramedImage.qml
RESOURCES
img/world.png
)
target_link_libraries(helloworld PRIVATE Qt6::Quick)
Let's walk through the changes we have made, compared to the console application CMakeLists.txt:
...
find_package(Qt6 6.5 COMPONENTS Quick REQUIRED)
In the find_package() call, we replace Core with Quick. CMake will therefore load the Qt6Quick module and provide the Qt6::Quick targets we later link against. CMake will also automatically load packages Quick depends on, like Qt6Qml, which defines the qt_add_qml_module() command we use below.
We also require Qt 6.5 or newer.
qt_standard_project_setup(REQUIRES 6.5)
The qt_standard_project_setup() command sets project-wide defaults for a typical Qt application. By adding REQUIRES 6.5, we enable the policy QTP0001, which defines a default resource prefix for QML modules created by qt_add_qml_module().
...
qt_add_qml_module(helloworld
URI hello
QML_FILES
main.qml
FramedImage.qml
RESOURCES
img/world.png
)
qt_add_qml_module() adds a QML module named hello to the executable, consisting of two QML files and one image. Due to QTP0001, the module will be available at qrc:/qt/qml/hello in the resource file system, with qrc:/qt/qml/ being one of the QML engine's default import paths.
qt_add_qml_module() also does optimization steps like running the QML script compiler, and defining a helloworld_qmllint target which you can run to get additional suggestions about the .qml files from qmllint.
target_link_libraries(helloworld PRIVATE Qt6::Quick)
In the target_link_libraries() command, we link our executable against Qt6::Quick. This automatically also links against targets Qt6::Quick depends on, including Qt6::Qml and Qt6::Core.