模块化开发之一:QML文档路径导入
模块化开发之一:QML文档路径导入
QML文件的本地路径可以被导入,而不需要任何额外的安装和配置。远程的QML文件路径也可以被导入,但必须要有一个路径列表类型的qmldir文件。本地路径也可以有一个路径列表类型的qmldir文件,以便于定义类型名称,当客户端导入这些路径时,可以获得这些类型,也可以导入客户端所需要的,在qmldir中指定的JavaScript资源。
本地路径导入
本地文件系统中的任何QML文件都可以使用import声名,来导入一个绝对或相对文件路径,使得定义在路径中所含文件的对象类型可用。
如果本地文件夹中含有一个路径列表类型的qmldir文件,qmldir中指定的类型名称就可用,否则,就会用QML文件名作为类型的名字。如果文件夹中没有qmldir,则只有以大写字母开头且以".qml"为后辍的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 {
// ...
}
导入本地路径,对于导入程序内组件集和程序原型组件很方便,虽然在组件路径发生任何变更时,都需要更改用到这些组件的代码的导入声明。但这可以通过应用 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文件。前者允许一组QML文件快速和容易被分享,但它并未为这些即将注册的QML对象类型定义命名空间,也不支持这些QML对象的版本定义。
路径列表类型的qmldir文件的语法如下:
命令 | 语法 | 说明 |
---|---|---|
Object Type Declaration | <TypeName> <FileName> |
An object type declaration allows a QML document to be exposed with the given . Example: <br/>RoundedButton RoundedBtn.qml<br/> |
Internal Object Type Declaration | internal <TypeName> <FileName> |
An internal object type declaration allows a QML document to be registered as a type which becomes available only to the other QML documents contained in the directory import. The internal type will not be made available to clients who import the directory. Example: <br/>internal HighlightedButton HighlightedBtn.qml<br/> |
JavaScript Resource Declaration | <Identifier> <FileName> |
A JavaScript resource declaration allows a JavaScript file to be exposed via the given identifier. Example: <br/>MathFunctions mathfuncs.js<br/> |
本地文件路径中也可以包含(也可以不包含)一个qmldir文件。这能够让引擎仅暴露特定QML类型给导入路径的clients。而且,如果不在qmldir中明确声明JavaScript资源,则也不会被暴露给clients。