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.

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.