Skip to content

qml property and PROPERTY macro

KerwinKoo edited this page Dec 28, 2015 · 2 revisions

Qt5.4 QML 创建属性快捷宏

宏格式

Q_OBJECT
Q_PROPERTY(QString name READ name WRITE setName)
Q_PROPERTY(QColor color READ color WRITE setColor)

说明: Q_PROPERTY()是一个宏,用来在一个类中声明一个属性property,由于该宏是qt特有的,需要用moc进行编译,故必须继承于QObject类。

宏的使用说明

Q_PROPERTY(type name
            READ getFunction
            [WRITE setFunction]
            [RESET resetFunction]
            [DESIGNABLE bool]
            [SCRIPTABLE bool]
            [STORED bool]) 
For example: 
Q_PROPERTY(QString title READ title WRITE setTitle)
1.必须有一个read函数。
2.有一个可选的write函数。
3.如果定义了"stored"属性表明这是一直存在的。
4.一个reset函数能够把property设置成其默认状态
5.一个"desinable"属性表明该property能在GUI builder(一般为Qt Designer)可见

QObject类是所有Qt对象的基类,作为Qt对象模型的核心,提供了信号与槽机制等很多重要特性。Q_OBJECT宏必须在private区(C++默认为private)声明注册且定义了属性,才可以在QML中进行该属性的赋值.

一个property属性可以在C++中定义(用上面的方法),并且通过Q_PROPERTY注册到QML类型系统。当然,我们也可以在QML文档中通过如下语法自定义对象的property属性:

[default] property <propertyType> <propertyName>

通过这种方式,一个对象可以将一些特定的值暴露给其它对象,或者是更加简便的维护一些内部状态。 Property属性的名称必须以小写字母开头,且只能包含字母,数字和下划线。

JavaScript的保留关键字不能作为property属性的名称。

Default关键字是可选的.

定义一个自定义的property属性也就为该property属性隐式的创建了一个value-change信号,也就是关联了一个名为

on<PropertyName>Changed

signal handler<PropertyName>就是property属性的名称,而且首字母要大写。每个QML属性改变后都会产生信号

代码举例

例如:下面就定义了两个property属性,并且实现了其signalhandler:

Rectangle {
    property color perviousColor
    property color nextColor
    onNextColorChanged:

Qt5.4 QML 自定义属性

自定义property属性的合法类型

QML基本类型中的枚举类型都可以作为自定义property属性类型。

例如:下面都是合法的property属性声明;

一些QtQuick模块提供的基本类型是不能作为property类型的,除非在QML文档中导入QtQuick模块。 var基本类型是通用的类型,可以保存任意类型的值,包括lists和objects:

property var number:1.5
property var someString:"abc"
property var someList:[1, 2, "abc", "four"]
property var someObject: Rectangle { width:100; height:300; color:"red"}

任何的QML对象类型都可以被用作property属性类型。例如:

property Item someItem
property Rectangle someRectangle

[[TOC]]

Clone this wiki locally