导入 QML 文档目录
本地 QML 文件目录无需任何额外设置或配置即可导入。远程 QML 文件目录同样可以导入,但需要存在一个目录列表文件qmldir 。 本地目录可选地包含一个目录列表文件qmldir ,用于定义应提供给导入该目录的客户端的类型名称,并指定应向导入者提供的 JavaScript 资源。
Qt 假定导入目录中的所有文件均来自可信来源。
本地目录导入
本地文件系统上的任何 QML 文件都可以通过引用该目录的绝对或相对文件系统路径的 import 语句来导入本地目录,从而使该文件能够使用该目录中定义的对象类型。
QML Runtime 会从被导入的目录中读取可选的目录列表文件 `qmldir `,以发现其中用 QML 和 C++ 定义的可用类型。qmldir 文件指定了在 QML 中定义的类型名称,以及包含 C++ 定义类型的插件的路径。
如果存在qmldir 文件,QML 文件将使用该文件中指定的类型名称提供;否则,将使用从 QML 文档文件名派生的类型名称提供。如果目录中未指定qmldir 文件,则只有以大写字母开头且以 ".qml" 结尾的文件名才会作为类型暴露出来。
QML Runtime 会加载qmldir 文件中列出的所有插件,以查找从 C++ 暴露的所有类型。
目录导入的优先级低于任何模块导入。如果同一个名称在模块和目录中均被定义,且两者都被导入到同一个命名空间中,则仅提供模块中的类型。
一个示例
考虑以下 QML 项目目录结构。在顶级目录myapp 下,有一个名为mycomponents 的子目录,其中包含一组常见的 UI 组件;还有一个名为main 的子目录,其中包含主要应用程序代码,结构如下:
myapp
|- mycomponents
|- CheckBox.qml
|- DialogBox.qml
|- Slider.qml
|- main
|- application.qmlmain/application.qml 文件可以使用指向该目录的相对路径导入mycomponents 目录,从而能够使用该目录中定义的 QML 对象类型:
该目录可导入到一个限定后的本地命名空间中,在这种情况下,对该目录中提供的任何类型的使用都必须进行限定:
import "../mycomponents" as MyComponents
MyComponents.DialogBox {
// ...
}导入本地目录的功能对于应用程序内部的组件集和应用程序原型设计等情况非常方便,但若模块目录移动到其他位置,任何导入此类模块的代码都必须更新其相关的import 语句。如果改用QML 模块,则可以避免这种情况,因为已安装的模块是通过唯一的标识符字符串而非文件系统路径进行导入的。
隐式导入
QML文档所在的目录会被自动导入。您无需显式导入"." 或类似内容。
注意:应 确保指定 QML 文档所属模块的 `qmldir` 文件与该 QML 文档本身位于同一目录下。 否则,隐式导入的目录将与文档所属的模块不同。例如,另一个 QML 文档在该模块的上下文中可能是单例,但在隐式导入的上下文中却可能不是单例。这是常见的错误来源。
远程目录
如果某个包含 QML 文件的目录中存在一个列出目录结构的 `qmldir ` 文件,则该目录也可从远程位置导入。
注意:这 同样适用于 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 的语法如下:
| 命令 | 语法 | 描述 |
|---|---|---|
| 对象类型声明 | <类型名> <文件名> | 对象类型声明允许将 QML 文档通过给定的<TypeName> 进行公开。示例: |
| 内部对象类型声明 | internal <TypeName> <FileName> | 内部对象类型声明允许将 QML 文档注册为一种类型,该类型仅对包含在 `import` 目录中的其他 QML 文档可用。导入该目录的客户端将无法访问该内部类型。 示例: |
| JavaScript 资源声明 | <标识符> <文件名> | JavaScript 资源声明允许通过给定的标识符暴露一个 JavaScript 文件。 示例: |
本地文件系统目录可选地包含一个qmldir 文件。这使得引擎仅向导入该目录的客户端暴露特定的QML类型。此外,除非在qmldir 文件中进行了声明,否则该目录中的JavaScript资源不会向客户端暴露。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.