1. 第一部分先了解 qmldir 文件如何定义,以及各部分含义。

  2. 第二部分再总结关于 import 语句(其实就是告诉引擎QML文档中能够使用哪些模块JavaScript资源组件目录)。接下来会讲解这三种类型的导入,每种导入类型的语法略有不同,适用于不同导入类型的语义也不同。

1 Moudle模块的定义

1.1 手动编写qmldir文件

模块是由一个名为 qmldir 的文件指定的,我们可以打开QT中模块所在的文件夹看看,每个模块都对应一个 qmldir 文件。

alt text

我们在 /assets/Qt6/qml_09_import/ 下创建一个 qmldir 文件。

基本内容格式如下:

  • module <ModuleIdentifier>module关键字,后接模块标识符,每个qmldir文件只能有一个标识符。

  • linktarget <libname>:CMake编译的时候需要链接该组件,该组件库名称就是 <libname>

  • [optional] plugin <Name> [<Path>]

    • [optional]: 表示该插件本身不包含任何相关代码,仅仅用于加载其他链接的库。

    • <Name>: 是插件库的名称。具体完整名称跟系统有关。例如,库 MyAppTypes 在 Linux 上会生成 libMyAppTypes.so,而在 Windows 上会生成 MyAppTypes.dll。

    • <Path>(可选):指定一个包含插件文件的目录的绝对路径,或一个从包含 qmldir 文件的目录到包含插件文件的目录的相对路径。

  • classname <C++ plugin class>:提供模块使用的 C++ 插件的类名。对于所有依赖于 C++ 插件以实现附加功能的 QML 模块,此信息是必需的。使用静态链接构建的 Qt Quick 应用程序在没有此信息的情况下无法解析模块导入。

  • import <ModuleIdentifier> [<Version>] :声明会导入另外模块

  • depends <ModuleIdentifier> [<InitialVersion>]:表示依赖其他模块,也就会导入其他模块。

  • typeinfo <File>: 声明一个类型描述文件,用于模块,可以被 QML 工具(如 Qt Creator)读取,以访问模块插件定义的类型信息。

  • [singleton] <TypeName> <InitialVersion> <File>: singleton用来声明一个单例类型,它是可省略的。TypeName是类型名称。InitialVersion用来指定版本号。File是QML类型对应文件所在的位置。

这是手动编写最基本的qmldir文件如下:

alt text

1.2 使用 qt_add_qml_module 自动生成

具体可以参考QML——第二十六节:制作扩展插件

官方提供的模块qmldir 文件分析:

alt text

alt text

模块中相应的***.qmltypes 文件分析:

alt text

2 Module模块导入

最常见的导入类型就是模块导入。如果最后使用 as 就是把模块注册到给定的命名空间中,如果没有使用 as 就是全局都可以直接使用模块内包含的组件。

import <ModuleIdentifier> <Version.Number> [as <Qualifier>]
  • <ModuleIdentifier>:模块的名称,必须以大写字母开头。

  • <Version.Number>:模块的版本号,Qt6中如果没有指定版本号,默认使用最高版本的模块。

  • <Qualifier>:是一个可选的局部命名空间标识符,模块提供的对象类型和JavaScript资源将被安装到其中。如果省略,则模块提供的对象类型和JavaScript资源将安装到全局命名空间中。

示例:

/* 这个导入允许使用QtQuick模块提供的所有类型,而不需要指定限定符。 */

import QtQuick 2.0

Rectangle {
      width: 200
      height: 100
      color: "red"
}

/* 其实该种情况可以解决比如 A 和 B 模块都有 Rectangle 的情况(也就是命名空间的作用) */
import QtQuick 2.0 as Quick

Quick.Rectangle {
      width: 200
      height: 100
      color: "red"
}

2.1 自定义模块如何导入

方式一:import “目录(路径)”

alt text

方式二:添加路径到环境变量

  1. 在代码中,调用 QQmlEngine::addImportPath() 方法添加路径。

  2. 使用 QML2_IMPORT_PATH 环境变量来指定模块所在路径,注意QML后面有个2。

    在windows系统中,计算机 - 系统属性 - 高级系统属性 - 环境变量

    alt text

  3. 在Qt Design Studio项目中,可以在 ***.qmlproject 添加目录到 importPaths 列表中。

    会检索添加目录下面的所有目录中的 qmldir 文件。

    alt text

2.2 路径(目录)导入

2.2.1 本地目录导入

本地文件系统上的任何QML文件都可以使用import语句导入本地目录,该语句引用目录的绝对或相对文件系统路径,从而使文件能够使用在该目录中定义的对象类型。

自定义的组件必须以大写字母开头

alt text

2.2.2 远程目录导入

import "http://www.my-example-server.com/myapp/mycomponents"

DialogBox {
      CheckBox {
          // ...
      }
      Slider {
          // ...
      }
}

2.3 JavaScript资源导入

可以在QML文档中直接导入JavaScript资源。每个JavaScript资源都必须有一个用于访问的标识符。

JavaScript资源导入的一般形式如下:

import "<JavaScriptFile>" as <Identifier>

参考

参考1:QML- 导入库包语法

参考2:QML——添加自定义模块

参考3:QML自定义模块及qmldir的使用