一、概述
QML文档是一个符合QML文档语法的字符串。文档定义了QML对象类型。文档通常从 .qml 文件中加载,这个Qml文件存储在本地或远程,但可以在代码中手动构造。文档定义的对象类型的实例可以使用QML代码中的Component创建,也可以使用c++中的QQmlComponent创建。或者,如果对象类型以特定的类型名显式地向QML类型系统公开,则可以在其他文档的对象声明中直接使用该类型。
在文档中可以定义可重用的QML对象类型的能力是允许客户编写模块化、高可读性和可维护性代码的重要推动因素。 显然qml是支持的,这种模块化的工具很像 python 以文件为单位的模块方式引入,qml 也是支持这种功能的。
从Qt 5.4开始,文件扩展名也可以是 “.ui.qml”。QML引擎像处理标准的. QML文件一样处理这些文件,并忽略扩展名的 .ui 部分。
Qt Creator将这些文件作为Qt Quick Designer的UI表单处理。
二、QML文档的结构
QML文档由两个部分组成:import 导入部分和 对象声明部分。按照约定,只需要单个空行将导入与对象层次结构定义分开。
QML文档总是以UTF-8格式编码。
-
文档中的 import 导入部分包含定义文档可以使用哪些QML对象类型和JavaScript资源。
-
对象声明部分定义了实例化文档定义的对象类型时要创建的对象树。
简单文档的示例如下:
import QtQuick 2.0
Rectangle {
width: 300
height: 200
color: "blue"
}
-
import 的要点:
文档必须导入必要的模块或类型命名空间,以使引擎能够加载文档中引用的QML对象类型。默认情况下,文档可以访问同一目录中通过.qml文件定义的任何QML对象类型;如果文档需要引用任何其他对象类型,它必须导入注册了这些类型的类型命名空间。
与C或c++不同,QML没有在呈现给QML引擎之前修改文档的预处理器。import语句不会复制和添加文档中的代码,而是指示QML引擎如何解析文档中的类型引用。QML文档中出现的任何类型引用(如Rectangle和ListView),包括在JavaScript块或属性绑定中创建的类型引用,都完全基于import语句来解析。必须至少有一个导入语句,如import QtQuick 2.0。 -
根对象 的要点:
QML文档描述了可实例化的对象层次结构。每个对象定义都有一定的结构;它有类型,可以有id和对象名,可以有属性,可以有方法,可以有信号,可以有信号处理程序。
一个QML文件必须只包含一个根对象定义。下面的代码是无效的,会报错,这是因为 .qml 文件自动定义了一个QML类型,它封装了单个QML对象定义。以便于后面模块复用的:
// MyQmlFile.qml
import QtQuick 2.0
Rectangle {
width: 200; height: 200; color: "red" }
Rectangle {
width: 200; height: 200; color: "blue" } // invalid!
三、通过QML文档定义对象类型
正如前一节所简要描述的,文档隐式定义了QML对象类型。QML的核心原则之一是定义并重用对象类型的能力。这提高了QML代码的可维护性,增加了对象层次结构声明的可读性,并促进了UI定义和逻辑实现之间的分离。
在下面的例子中,客户端开发人员在文件中定义了一个Button类型的文档:
// Button.qml
import QtQuick 2.0
Rectangle {
width: 100; height: 100
color: "red"
MouseArea {
anchors.fill: parent
onClicked: console.log("Button clicked!")
}
}
Button类型可以在应用程序中使用:
// application.qml
import QtQuick 2.0
Column {
Button {
width: 50; height: 50 }
Button {
x: 50; width: 100; height: 50; color: "blue" }
Button {
width: 50; height: 50; radius: 8 }
}
四、资源加载和网络透明性
重要的是要注意QML是网络透明的。应用程序可以像从本地路径导入文档一样简单地从远程路径导入文档。事实上,任何url属性都可以被分配一个远程或本地url, QML引擎将处理任何涉及的网络通信。
五、作用范围和命名解决方案
文档中的表达式通常涉及对象或对象的属性,由于可能定义多个对象,并且不同的对象可能具有相同名称的属性,因此必须由QML定义一些预定义的符号解析语义。