模块化开发之一: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。

posted @ 2022-04-27 20:27  sammy621  阅读(1345)  评论(0编辑  收藏  举报