QML Documents

QML文档是一个符合QML语法的字符串. 文档定义QML对象类型. 通常, 文档是从本地或远程加载的".qml"文件, 但是, 也可以直接采用代码手动构建. 文档定义的对象类型的实例可以使用QML的Component或C++的QQmlComponent创建. 或者, 如果对象类型以特定的类型名称显式地暴露给QML类型系统, 则可以在其他文档中的对象声明中直接使用这个类型.

在文档中定义可重复使用的QML对象类型的能力是允许客户端编写模块化, 高度可读和可维护代码的重要因素.

从Qt 5.4开始, 文档的文件扩展名也可以是".ui.qml". QML引擎像处理标准. qml文件一样处理这些文件, 并忽略扩展名的.ui部分. Qt Design Studio将这些文件作为UI 文件处理. 这些文件只能包含QML语言功能的一个子集.

QML文档结构

QML文档由两个部分组成: 导入部分和对象声明部分. 文档中的导入部分包含导入语句, 这些语句定义文档可以使用的QML对象类型和JavaScript资源. 对象声明部分定义了在实例化文档定义的对象类型时要创建的对象树.

一个简单的文档示例如下:


  import QtQuick 2.0

  Rectangle {
      width: 300
      height: 200
      color: "blue"
  }

详见 Structure of a QML Document.

QML语法

对象声明部分必须使用适当的QML 语法指定有效的对象层次结构. 一个对象声明可以包含自定义对象属性. 对象方法属性可以是JavaScript函数, 并且对象属性可以指定属性绑定表达式.

更多语法信息参见 syntax of QMLintegrating QML and JavaScript .

定义对象类型

如上所述, 文档隐式地定义了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 }
  }

详见 defining object types in documents.

资源加载和网络透明

QML是网络透明的. 应用程序加载远程文件, 跟本地文件一样简单. 事实上, 任何url属性都可以被分配一个远程或本地url, QML引擎将处理所涉及的任何网络通信.

有关导入文档中网络透明的更多信息, 参见 Network Transparency.

作用域和命名空间

表达式通常涉及对象或对象的属性. 由于可以定义多个对象, 并且不同的对象可能具有相同名称的属性, 因此, QML必须定义一些预定义的符号解析语义. 详见 scope and symbol resolution.