构建可重用的 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的商标。商标。所有其他商标为其各自所有者的财产。