导入 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 "../mycomponents"

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

可以将目录导入到合格本地命名空间中,在这种情况下,必须使用合格名称使用目录提供的任何类型

import "../mycomponents" as MyComponents

MyComponents.DialogBox {
    // ...
}

导入本地文件夹的能力对于情况如应用程序组件集和应用程序原型很有用,尽管任何导入此类模块的代码都必须更新其相关的 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 导入此目录

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

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

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

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

目录列表 qmldir 文件

目录列表 qmldir 文件与 模块定义 qmldir 文件 有明显的不同。目录列表 qmldir 文件允许一组 QML 文档快速简单地共享,但它不会定义一个类型命名空间,在该命名空间中,由文档定义的 QML 对象类型将被注册,也不会对这些 QML 对象类型进行版本控制。

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

命令语法描述
对象类型声明<TypeName> <FileName>对象类型声明允许使用给定的 <TypeName> 暴露 QML 文档。

示例

RoundedButton RoundedBtn.qml
内部对象类型声明internal <TypeName> <FileName>内部对象类型声明允许将 QML 文档注册为一个类型,该类型仅在目录导入中包含的其他 QML 文档中使用。内部类型将不会对导入目录的客户端可用。

示例

internal HighlightedButton HighlightedBtn.qml
JavaScript 资源声明<Identifier> <FileName>JavaScript 资源声明允许通过给定的标识符暴露 JavaScript 文件。

示例

MathFunctions mathfuncs.js

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

© 2024 Qt 公司有限公司。此处包含的文档贡献是各自所有者的版权。此处提供的文档受 GNU 自由文档许可证版本 1.3 的条款约束,由自由软件基金会发布。Qt 以及相应的标志是芬兰及/或世界其他国家/地区的 Qt 公司有限公司的商标。所有其他商标均为其各自所有者的财产。