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.