构建可重用的 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 类型,请将相应的头文件和源文件作为参数添加到 SOURCES 参数中。
构建项目时,除了库之外,还会生成一个 QML 插件。该插件的自动生成的类继承自QQmlEngineExtensionPlugin 。mylib 库本身已包含向引擎注册类型的代码。不过,这仅在我们可以链接该库的情况下才有用。 若要使该模块可在由“qml ”(QML Runtime 工具)加载的QML文件中使用,则需要一个可加载的插件。该插件将负责实际链接到该库,并确保类型被注册。
请注意,只有当模块除了注册类型之外不执行其他操作时,才可能进行自动插件生成。如果它需要执行更高级的操作(例如在initializeEngine 中注册图像提供程序),您仍然需要手动编写插件。qt_add_qml_module()通过NO_GENERATE_PLUGIN_SOURCE 支持此功能。
此外,遵循目录布局约定有助于工具的运行。该布局在构建目录中得到了映射。这意味着你可以将构建目录的路径传递给 QML 工具(通过-I 标志),它将自动找到该插件。
© 2026 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.