导入 QML 文件夹#

QML 中目录导入语句的描述

不需要任何额外设置或配置,即可导入本地 QML 文件夹。要导入远程 QML 文件夹,则需要存在一个包含目录列表示述的 qmldir 文件。本地文件夹可以可选地包含一个 qmldir 列表示述文件,以便定义应该提供给导入目录的客户机的类型名,并指定应提供导入器的 JavaScript 资源。

本地文件夹导入#

本地文件系统上的任何 QML 文件都可以使用引用文件夹的绝对或相对文件系统路径的导入语句来导入本地文件夹,从而使得文件可以使用该文件夹内定义的 对象类型

如果本地文件夹包含一个目录列表示述 qmldir 文件,则类型将以在 qmldir 文件中指定的类型名提供;否则,它们将以从 QML 文档的文件名派生的类型名提供。如果没有在目录中指定 qmldir 文件,则仅以大写字母开头并以 “.qml” 结尾的文件名将公开为类型。

目录导入的优先级低于任何 模块导入。如果模块和文件夹都在同一个命名空间中导入,并且定义了相同名称,则仅提供模块的类型。

示例#

考虑以下 QML 项目的目录结构。在顶层目录 myapp 之下,有一个名为 mycomponents 的子目录,包含了常见的 UI 组件,主应用代码在一个名为 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文件的语法如下

命令

语法

说明

对象类型声明

<TypeName> <FileName>

对象类型声明允许QML文档以给定的<TypeName>暴露出来。

示例

RoundedButton RoundedBtn.qml

内部对象类型声明

internal <TypeName> <FileName>

内部对象类型声明允许将QML文档注册为类型的单例,只有目录导入中包含的其他QML文档能够访问该类型。内部类型不会对外部导入目录的客户可用。

示例

internal HighlightedButton HighlightedBtn.qml

JavaScript资源声明

<Identifier> <FileName>

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

示例

MathFunctions mathfuncs.js

本地文件系统目录可以包含qmldir文件。这允许仅将某些QML类型暴露给导入目录的客户端。此外,除非在qmldir文件中声明,否则目录中的JavaScript资源不会暴露给客户端。