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.