构建 QML 应用程序

构建 C++ 控制台应用程序 , we showed the CMakeLists.txt file for a simple console application. We will now create a QML application that uses the Qt Quick 模块。

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)
					

find_package() 调用,我们替换 Core with Quick . CMake will therefore load the Qt6Quick 模块并提供 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 脚本编译器 , 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)
					

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 .