构建可重用的 QML 模块

以下示例演示了如何创建一个将 C++ 暴露给 QML 的库。示例的目录结构如下所示

├── CMakeLists.txt
└── example
    └── mylib
        ├── CMakeLists.txt
        ├── mytype.cpp
        ├── mytype.h

顶层的 CMakeLists.txt 文件使用 qt_standard_project_setup 进行一些基本设置,然后使用 add_subdirectory 包含 mylib 中的一个

cmake_minimum_required(VERSION 3.16)

project(qmlmodule VERSION 1.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Qml)
qt_standard_project_setup(REQUIRES 6.5)

add_subdirectory(example/mylib)

子目录的结构对应于 QML 模块的 URI,但用斜线替换了点。这是引擎在查找 导入路径 中的模块时使用的相同逻辑。遵循此子目录结构有助于工具。

mytype.h 声明了一个类并使用 声明性注册宏 将它暴露给引擎。

在子目录的 CMakeLists.txt 中,我们调用 qt_add_qml_module。与 构建 QML 应用 相比,调用略有不同

qt_add_qml_module(mylib
    URI example.mylib
    VERSION 1.0
    SOURCES
        mytype.h mytype.cpp
    QML_FILES
        MyQmlType.qml
)

mylib 的目标之前还没有创建。当传递给 qt6_add_qml_module 的目标不存在时,它会自动创建一个库目标。这避免了单独调用 qt_add_library。要注册在 C++ 中定义的 QML 类型,请将它们的头文件和源文件作为 ARGUMENTS 参数的参数添加。

当项目构建时,除了库之外,还会构建一个 QML 插件。该插件自动生成的类继承自 QQmlEngineExtensionPlugin。mylib 库本身已包含将类型注册到引擎中的代码。然而,这只在有链接到库的情况下才有用。为了使模块在 qml 加载的 QML 文件中可用,需要可以加载的插件。该插件将负责实际链接到库,并确保类型已注册。

请注意,只有当模块不受除注册类型之外的任何操作时,才会自动生成插件。如果它需要在 initializeEngine 中注册图像提供者等更高级的操作,您仍然需要手动编写插件。 qt6_add_qml_module 支持此功能,通过 NO_GENERATE_PLUGIN_SOURCE

此外,遵循目录布局约定也有助于工具。此布局在构建目录中得到反映。这意味着您可以传递构建目录的路径到 QML 工具(通过 -I 标志),然后它会找到插件。

© 2024 Qt公司有限。本文档中包含的贡献文档的所有权归其各自所有者。本提供的文档是根据自由软件基金会发布的GNU自由文档许可证版本1.3的条款许可。Qt及其标志是芬兰和/或世界上其他国家的The Qt Company Ltd的商标。商标。所有其他商标为其各自所有者的财产。