数据类型可以是QML语言原生的,可以通过C++注册,可以由独立的QML文档作为模块进行加载,也可以由开发者通过C++类型或者定义QML组件来提供自定义的类型。

不过,无论如何,QML引擎都会保证这些类型的属性和实例的类型安全。

一、 基本类型

1. 基本类型

基本类型不能用来声明一个QML对象,例如int{}是不被允许的。

基本类型一般用于以下两种值:

  • 单值(例如, int是单个数字,var可以是单个项目列表);
  • 一个包含了一组简单的“属性-值”对的值(例如,size指定的值包含了width和height属性)

部分基本类型是引擎默认支持的,不需要导入语句即可使用;另外的基本类型则在模块中提供,需要导入才能使用。

另外,Qt全局对象提供了一些非常有用的函数操作基本类型的值,如darker()fromatDatehals()md5()qsTr()quit()等,可以在帮助文档中索引QML Global Object关键字查看更多内容。

QML语言原生支持的基本类型

QML其他基本类型由某些模块提供,如QtQuick模块提供的基本类型如下:

QtQuick模块提供的基本类型表

2.基本类型的属性改变行为

一些一本类型也包含属性,如font类包含pixelSizefamiltbold。这里所说的属性与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对象类型:

  1. 创建.qml文件来定义类型
  2. 通过C++定义QML类型,然后在QML引擎中注册该类型。

参考书籍:《QML和Qt Quick快速入门(霍亚飞)》

07-23 04:22