导入 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 文档在模块上下文中可能是单例,但在隐式导入上下文中却不是单例。这是经常出错的原因。

远程定位目录

如果 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 文档,但它没有定义一个类型名称空间(type namespace),文档定义的 QML 对象类型会注册到该名称空间,它也不支持这些 QML 对象类型的版本管理。

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

命令语法说明
对象类型声明<TypeName> <FileName> 对象类型声明对象类型声明允许用给定的<TypeName> 公开 QML 文档。

示例

RoundedButton RoundedBtn.qml
内部对象类型声明内部 <类型名> <文件名内部对象类型声明允许 QML 文档注册为一种类型,这种类型只对目录导入中包含的其他 QML 文档可用。导入目录的客户无法使用内部类型。

举例说明

internal HighlightedButton HighlightedBtn.qml
JavaScript 资源声明<标识符> <文件名JavaScript 资源声明允许通过给定的标识符公开 JavaScript 文件。

示例

MathFunctions mathfuncs.js

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

© 2025 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.