导入QML文档目录

QML中目录导入语句的描述

可以导入QML文件的本地目录,无需任何额外的设置或配置。也可以导入QML文件的远程目录,但需要存在一个目录列表qmldir文件。本地目录可以选择性地包含一个目录列表qmldir文件,以定义应提供给导入目录的客户端的类型名称,并指定应提供给导入者的JavaScript资源。

本地目录导入

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

如果本地目录包含一个目录列表 qmldir 文件,类型将使用 qmldir 文件中指定的类型名称提供;否则,它们将使用从 QML 文档的文件名派生的类型名称提供。如果目录中没有指定 qmldir 文件,只有以大写字母开头并以“.qml”结尾的文件名才会作为类型暴露。

目录导入的优先级低于任何模块导入。如果在模块和目录中定义了相同的名称,并且它们都被导入到同一个命名空间中,则只有模块的类型可用。

一个示例

考虑以下的QML项目目录结构。在顶级目录myapp下,有一组常见的UI组件位于名为mycomponents的子目录中,主应用程序代码位于名为main的子目录中,如下所示:

myapp
    |- mycomponents
        |- CheckBox.qml
        |- DialogBox.qml
        |- Slider.qml
    |- main
        |- application.qml

main/application.qml 文件可以使用相对路径导入 mycomponents 目录,从而使用该目录中定义的 QML 对象类型:

目录可以导入到一个限定的本地命名空间中,在这种情况下,使用目录中提供的任何类型都必须进行限定:

导入本地目录的能力对于应用程序内组件集和应用程序原型设计等情况非常方便,尽管如果模块目录移动到另一个位置,任何导入此类模块的代码都必须更新其相关的import语句。如果使用QML模块,则可以避免这种情况,因为安装的模块是通过唯一标识符字符串而不是文件系统路径导入的。

隐式导入

QML文档所在的目录会自动导入。您不需要显式导入"."或类似的内容。

注意

您应确保指定QML文档所属模块的qmldir文件与QML文档本身位于同一目录中。否则,隐式导入与文档所属模块不同。例如,另一个QML文档在模块的上下文中可能是单例,但在隐式导入的上下文中不是单例。这是常见的错误来源。

远程定位目录

如果目录包含目录列表qmldir文件,则可以从远程位置导入QML文件的目录。

注意

这也适用于QML文档所在目录的隐式导入。如果您的QML文档是从远程位置加载的,即使它们不包含任何显式的目录导入语句,您也需要添加qmldir文件。否则,您的QML文档将无法相互识别。

例如,如果前例中的myapp目录托管在“http://www.my-example-server.com”,并且mycomponents目录包含一个qmldir文件,其定义如下:

CheckBox CheckBox.qml
DialogBox DialogBox.qml
Slider Slider.qml

然后,可以使用远程mycomponents目录的URL导入该目录:

请注意,当文件通过网络导入目录时,它只能访问位于该目录中的qmldir文件中指定的QML和JavaScript文件。

警告

从远程服务器导入目录时,开发人员应始终小心,只从可信来源加载目录,以避免加载恶意代码。

目录列表 qmldir 文件

一个目录列表 qmldir 文件与 模块定义 qmldir 文件 明显不同。目录列表 qmldir 文件允许快速轻松地共享一组 QML 文档,但它不定义类型命名空间,文档定义的 QML 对象类型不会注册到该命名空间中,也不支持这些 QML 对象类型的版本控制。

目录列表qmldir文件的语法如下:

命令

语法

描述

对象类型声明

对象类型声明允许QML文档以给定的暴露。

示例:

RoundedButton RoundedBtn.qml

内部对象类型声明

internal

内部对象类型声明允许将QML文档注册为一种类型,该类型仅对包含在目录导入中的其他QML文档可用。内部类型不会对导入目录的客户端可用。

示例:

internal HighlightedButton HighlightedBtn.qml

JavaScript 资源声明

<标识符> <文件名>

JavaScript 资源声明允许通过给定的标识符暴露一个 JavaScript 文件。

示例:

MathFunctions mathfuncs.js

本地文件系统目录可以选择性地包含一个qmldir文件。这允许引擎仅向导入目录的客户端公开某些QML类型。此外,目录中的JavaScript资源不会向客户端公开,除非它们在qmldir文件中声明。