QML Modules
对于类型命名空间, QML模块提供版本标识和JavaScript资源. 模块提供的类型可以在C++编写的插件中定义, 也可以在QML文档定义. 模块使用QML版本控制系统, 允许模块独立更新.
QML模块定义允许:
- 项目中共享的公共QML类型, 例如, 不同窗口使用的一组UI组件
- 基于QML的发布库
- 不同功能的模块化, 使应用程序只加载满足其个人需求所需的库
- 类型和资源的版本控制, 以便在不破坏客户端代码的情况下安全地更新模块
定义QML模块
模块由qmldir文件定义. 每个模块都有一个关联的类型命名空间, 它是模块的标识符. 模块可以提供QML对象类型(由QML文档或通过C++插件定义)和JavaScript资源, 并且可以由客户端导入.
为了定义模块, 开发人员应该将模块中的各种QML文档, JavaScript资源和C++插件集中到一个目录中, 并编写一个适当的qmldir文件, 这个文件也应该放在这个目录中. 然后, 这个目录可以作为模块安装到QML导入路径中.
注意: 定义模块并不是在项目中共享常见QML类型的唯一方法, 也可以使用简单的QML文档目录导入.
支持的QML模块类型
QML支持两种不同类型的模块:
- Identified 模块
- Legacy 模块 (已弃用)
Identified模块具有明确的标识符, 并安装到QML导入路径. Identified模块更具维护性(类型版本), QML引擎保证类型注册, Legacy模块没有此类保证. QML支持Legacy Module仅为了遗留代码, 如果可能, 客户端应避免使用Legacy模块.
客户端可以从QML文档或JavaScript文件导入QML模块. 详见 importing a QML module.
采用C++插件提供类型和函数
一个采用C++实现大量逻辑的应用程序, 或采用C++定义类型, 并期望将其公开给QML, 可能希望实现QML插件. QML扩展模块开发人员可能希望使用C++插件实现某些类型(而不是通过QML文档定义它们), 以获得更好的性能或灵活性.
QML的每个C++插件都有一个初始化函数, QML引擎在加载插件时会调用该函数. 这个初始化函数必须注册插件提供的类型, 但不能执行任何其他操作(例如, 不允许实例化QObjects).