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
.