QML 模块
QML 模块在类型命名空间中提供版本化类型和 JavaScript 资源,导入模块的客户端可使用这些资源。模块提供的类型可在插件中用 C++ 定义,也可在 QML 文档中定义。模块使用 QML 版本系统,允许模块独立更新。
定义 QML 模块可以
- 在一个项目中共享共同的 QML 类型--例如,不同窗口使用的一组用户界面组件
- 分发基于 QML 的库
- 将不同的功能模块化,使应用程序只加载满足各自需求的必要库
- 类型和资源的版本化,使模块可在不破坏客户端代码的情况下安全更新
定义 QML 模块
注: 使用CMake API定义 QML 模块。只有在需要使用qmake
时,才手动定义 QML 模块。
模块由模块定义 qmldir 文件定义。每个模块都有一个相关的类型命名空间,它是模块的标识符。模块可提供 QML 对象类型(由 QML 文档或通过 C++ 插件定义)和 JavaScript 资源,并可由客户端导入。
要定义一个模块,开发人员应把属于模块的各种 QML 文档、JavaScript 资源和 C++ 插件集中到一个目录中,并编写一个适当的模块定义 qmldir 文件,该文件也应放在该目录中。然后,该目录就可以作为模块安装到QML 导入路径中。
请注意,定义模块并不是在项目中共享通用 QML 类型的唯一方法,简单的QML 文档目录导入也可用于此目的。
支持的 QML 模块类型
QML 支持两种不同类型的模块:
标识模块明确定义其标识符,并安装到 QML 导入路径中。标识模块更易于维护(因为有类型版本控制),QML 引擎还提供类型注册保证,而传统模块没有这些保证。支持传统模块只是为了让传统代码能继续使用最新版本的 QML,客户应尽可能避免使用传统模块。
客户可从 QML 文档或 JavaScript 文件导入 QML 模块。有关导入 QML 模块的更多信息,请参阅文档。
在 C++ 插件中提供类型和功能
如果一个应用程序有很多逻辑是用 C++ 实现的,或用 C++ 定义类型并把它们暴露给 QML,它可能希望实现一个 QML 插件。QML 扩展模块开发者可能希望在 C++ 插件中实现某些类型(而不是通过 QML 文档定义它们),以获得更好的性能或更大的灵活性。
QML 的每个 C++ 插件都有一个初始化函数,QML 引擎加载插件时会调用它。这个初始化函数必须注册插件提供的任何类型,但不能做任何其他事情(例如,不允许实例化 QObjects)。
更多信息,请参阅为 QML 创建 C++ 插件。
另请参阅 Modern QML modules(现代 QML 模块)和Port QML modules to CMake(将 QML 模块移植到 CMake)。
© 2025 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.