数据类型可以是QML语言原生的,可以通过C++注册,可以由独立的QML文档作为模块进行加载,也可以由开发者通过C++类型或者定义QML组件来提供自定义的类型。
不过,无论如何,QML引擎都会保证这些类型的属性和实例的类型安全。
一、 基本类型
1. 基本类型
基本类型不能用来声明一个QML对象,例如int{}
是不被允许的。
基本类型一般用于以下两种值:
- 单值(例如, int是单个数字,var可以是单个项目列表);
- 一个包含了一组简单的“属性-值”对的值(例如,size指定的值包含了width和height属性)
部分基本类型是引擎默认支持的,不需要导入语句即可使用;另外的基本类型则在模块中提供,需要导入才能使用。
另外,Qt全局对象提供了一些非常有用的函数操作基本类型的值,如darker()
、fromatDate
、hals()
、md5()
、qsTr()
、quit()
等,可以在帮助文档中索引QML Global Object关键字查看更多内容。
QML语言原生支持的基本类型
类型 | 描述 | 类型 | 描述 |
---|---|---|---|
int | 整型 | url | 资源定位符 |
bool | 布尔值,true/false | list | QML对象列表 |
real | 单精度浮点数 | var | 通用属性类型 |
double | 双精度浮点数 | enumeration | 枚举值 |
string | 字符串 | ———— | ———— |
QML其他基本类型由某些模块提供,如QtQuick模块提供的基本类型如下:
QtQuick模块提供的基本类型表
类型 | 描述 |
---|---|
color | ARGB颜色值,可以用多种方法表示 |
font | QFont的QML类型,包含了QFont的属性值 |
matrix4x4 | 一个4X4的矩阵 |
quaternion | 一个四元数,包含一个标量以及x、y和z属性 |
vector2d | 二维向量,包含x和y两个属性 |
vector3d | 三维向量,包含x、y和z共3个属性 |
vector4d | 四维向量,包含x、y、z和w个属性 |
date | 日期值 |
point | 点值,包含x和y两个属性 |
size | 大小值,包含width和height两个属性 |
rect | 矩形值,包含x、y、width和height4个属性 |
2.基本类型的属性改变行为
一些一本类型也包含属性,如font类包含pixelSize
、familt
和bold
。这里所说的属性与QML类型(如Rectangle)的属性不同:基本类型的属性没有自己的属性改变信号,只能为基本类型自身创建一个属性改变信号处理器。
例如:
Text{//不可用onFont.pixelSizeChanged: doSomething()//不可用font{onPixelSizeChanged: doSomething}//可用onFontChanged: doSomething()}
另外,每当基本类型的一个特性改变时,该基本类型都会发射自身的属性改变信号,例如:
Text {onFontChanged: console.log("font changed")text: "hello Qt!"Text {id: otherText}focus: true//按下键盘数字键1,2,3都会调用onFontChanged信号处理器Keys.onDigit1Pressed: font.pixelSize += 1Keys.onDigit2Pressed: font.italic = !font.italicKeys.onDigit3Pressed: font = otherText.font}
二、JavaScript类型
QML引擎直接支持JavaScript对象和数组,任何标注JavaScript类型都可以在QML中使用var类型进行创建和存储。
例如下面的Date和Array类型:
Item {property var theArray: []property var theDate: new Date()Component.onCompleted: {for (var i=0; i<10;++i)theArray.push("Item " +i)console.log("There are", theArray.length, "items in the array")console.log("The time is", theDate.toUTCString());}}
三、对象类型
QML对象类型用于QML对象的实例化。对象类型与基本类型最大的区别是,基本类型不能用于声明一个对象,而对象类型可以用来声明一个对象。
QML对象类型继承自QtQObject
,由各个模块提供。应用程序通过导入模块使用各种对象类型。QtQuick模块包含了创建用户界面所需要的最基本的对象类型。除了导入模块,还可以通过另外两种方式自定义QML对象类型:
- 创建
.qml
文件来定义类型 - 通过C++定义QML类型,然后在QML引擎中注册该类型。
参考书籍:《QML和Qt Quick快速入门(霍亚飞)》