数据类型可以是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语言原生支持的基本类型
QML其他基本类型由某些模块提供,如QtQuick模块提供的基本类型如下:
QtQuick模块提供的基本类型表
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 += 1
Keys.onDigit2Pressed: font.italic = !font.italic
Keys.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快速入门(霍亚飞)》