QML 类型

QML 类型

初次学习 QML 语言,了解下面这些名词非常关键,具体参考 (http://doc.qt.io/qt-5/qml-glossary.html)

术语 定义
QML 开发 QML 应用所使用的语言,是一种声明式语言,同时兼容 JavaScript 。语言架构和引擎都是通过 QtQML 模块实现的, QtQML 模块是 QML 语言的基石
Qt Quick QtQuick 也是一个模块,它是 我们进行 QML 应用程序开发所需要的 组件类型(type) 和 功能 (functionality) 构成的标准库 (standard library),包括多个子模块,如 Controls, Layout
Type (类型) QML 的所有对象都可以被分为两种类型: 基本类型 (Basic Type) 和 对象类型 (Object Type)。本文会详细介绍
Object (对象) QML 的对象都是 QML 对象类型的实例 (instance)。通过 QML 规定的 声明语法 可以实例化一个对象类型
Component (组件) 理解 Component 的概念非常重要,我为此单独写了一篇博客。

本文将介绍 QML 的 类型系统。

QML 语言 将 property 类型分为两种: 基本类型 (basic type) 和 对象类型 (object type)

记住两点:

  1. 基本类型存储的是拷贝 (copy),对象类型存储的是 指针 (pointer)
  2. 少用 var 类型,尽可能用具体的类型

1. 基本类型 (basic type)

只有 Qt 官方推出的模块才允许提供基本类型 (basic type) ,目前不支持第三方实现自定义的基本类型

Currently only QML modules which are provided by Qt may provide their own basic types, however this may change in future release of Qt QML.

参考官方文档: All QML Basic Types

QtQml 模块支持的基本类型:

  1. bool, double, real, int, string, var 等数据类型
  2. list 列表类型,enumeration 枚举类型, url (资源定位符)
  3. date (日期), point (坐标), rect (矩形), size (尺寸,包括 width 和 height)

QtQuick 模块支持的基本类型:

  1. color (颜色), font (字体), palette (画板),
  2. quaternion (包含属性 x, y, z )
  3. 数学类型, matrix4x4 , vector2d , vector3d, vector4d

此外 QtPositioning 模型还提供 地理位置相关的基本类型

  1. coordinate 地理坐标,包含经纬度
  2. geocircle 圆形地理区域
  3. geopath 地理路径
  4. geopolygon 地理多段线
  5. georectangle 矩形地理区域
  6. geoshape 上面基本类型的抽象基类

上面就是 QML 所有的 基本类型了 !

Note: QML 引擎 通过 var 基本类型 实现了对 JavaScript 类型的兼容,比如:

1.1 基本类型的初始化

问: QML 中 对象类型 (object type) 和基本类型 (basic type) 有何不同 ?

答: 对象类型和基本类型最大的不同在于,QML 对象类型可以被实例化 (instantiated),而基本类型不行。

问: QML 是如何实例化一个对象类型的呢 ?

答: 利用 声明语法: ObjectType {attribute: value} ,即对象类型后加花括号,花括号里面定义可配置属性和对应的值。基本类型只有简单的数据类型,不能通过上面这种方式初始化。也就是说,类似 int {} , size {} 这种实例化方式都是不允许的

: 既然基本类型不能采用实例化的方法初始化,那么QML 如何将其初始化 ?

答: 两种方法:

  • 如果是简单类型,直接初始化,比如 string, int, double 类型等

  • 如果是多变量结构体 (value that contains a simple set of property-value pairs),可以通过一个全局对象 Qt (详细内容请看 http://doc.qt.io/qt-5/qml-qtqml-qt.html) 初始化。Qt 包含在 QML 引擎中,虽然也是对象类型,但它并不能被实例化,只能直接使用。
    Qt 全局对象 提供的基本类型辅助初始化函数如下:

    函数 功能
    Qt.rect() 初始化 rect 类型
    Qt.size() 初始化 size 类型
    Qt.rgba(), Qt.hsla(), Qt.darker(), Qt.lighter(), Qt.tint() 初始化 color 类型
    Qt.font() 初始化 font 类型
    Qt.vector2d 初始化 vector2d 类型

    Note:

    Some basic types have properties: for example, the font type has pixelSize, family and bold properties. Unlike properties of object types, properties of basic types do not provide their own property change signals. It is only possible to create a property change signal handler for the basic type property itself.

2. 对象类型 (object type)

一直在说,所谓对象类型, 就是可以通过 QML 的声明语法 进行 实例化的类型

QtQML 提供的对象类型如下:

类型 作用
Component 组件类型,非常重要,会单独介绍
QtObject 只包含 property 属性,极轻量化类型
Binding 用于 property binding,但绑定对象不能被 QML 实例化的情形。
Connections 用于信号与槽的连接。好处: 实现多个槽函数和同一信号的绑定;实现在信号发送对象作用域外的连接;连接非 QML 语法定义的对象的信号
Timer 定时器

此外,Qt.QML 的子模块 QtQml.Modules 还提供 MVC 模型类型,包括

DelegateModel, DelegateModelGroup, ListElement, ListModel, ObjectModel

如果说 QtQml 是整个 QML 语言 的基石,那么 QtQuick 就是 QML GUI 开发必不可少的部分。它包含了各种 GUI 开发所需要的组件,

QtQuick 提供的所有 对象类型均是基于 Item 类型 (可视化组件类型的基类),而 Item 类型本身是基于 QtObject 类型的 (上面提到了)。QtQuick 大概提供了 50 多种对象类型,具体参考 QtQuick Object types

除了模块本身, QtQuick 还提供一系列子模块:

submodule function
XML List Model 从 XML 文档数据创建类型
Local Storage 提供 SQLite 数据库的 JavaScript 接口
Particles 提供 粒子系统
Windows 提供 创建顶层窗口 (ApplicationWindow) 的对象类型,以及窗口尺寸的信息
Dialogs 提供对话框的对象类型
Controls 最重要的 !!!! 提供一系列可复用的 UI 组件
Layouts 界面开发 中 UI 组件排列的类型
Tests QML 应用测试的对象类型

但是,如果我们的项目中需要自定义的可视化对象类型,怎么办 ?

答: 两种方法: QML Document (也称组件文件 Component file) 或者 C++ create, QML engine register

我们会在另外一篇博客详细介绍

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d 博主赞过: