QML的 property 支持的类型
来源:互联网 发布:二战苏联远东部队知乎 编辑:程序博客网 时间:2024/06/05 18:51
QML 的 property 支持的类型
本文的 qml 运行环境为 qt4,在 qt5 中同样支持。
在 Qt SDK 提供的文档中提及 property 支持类型。
qml 中的 property 的作用是动态为对象添加属性,并且添加的属性可以进行跟踪(值被修改了就会发出信号)
添加的属性,官方文档只提及了添加基础类型属性的说明。诸如:int
, double
, bool
, string
, variant
, color
, real
, vector3d
, url
, time
, rect
, size
, enumeration
, font
, date
, point
, list
, action
等基础到不能再基础的数据类型。
为 QtObject 添加 qml type 对象
这里提一个 qml 的元素: QtObject
。
这个 QtObject
元素是直接继承自 c++
类: QObject
,相对于 Item
占用的内存就小点。一般用来封装一些特定的功能函数。
但这个 QtObject
元素不能直接内嵌qml的其他元素,甚至连自己都不能内嵌。
比如下面的代码会报错:
//~ test.qmlimport QtQuick 1.1QtObject{ QtObject{ }}
Cannot assign to non-existent default property QtObject{ ^
如果我想要在 QtObject
嵌套一个可用的 qml
元素,可以像下面这种写法
import QtQuick 1.1QtObject{ property list<QtObject> __listObject: [ QtObject{ id:a; property int _num: 100 } ] property variant __varObject: QtObject{ id:b; property int _num: 1000 } property QtObject __object: QtObject{ id:c; property int _num: 10000 } Component.onCompleted: { console.debug("a:"+a._num); console.debug("b:"+b._num); console.debug("c:"+c._num); console.debug("__listObject:"+__listObject[0]._num); console.debug("__varObject:"+__varObject._num); console.debug("__object:"+__object._num); }}
输出结果是:
Qml debugging is enabled. Only use this in a safe environment!a:100b:1000c:10000__listObject:100__varObject:1000__object:10000QDeclarativeView only supports loading of root objects that derive from QGraphicsObject
<QDeclarativeView only supports loading of root objects that derive from QGraphicsObject >
这句就忽略不看
如果想要在 QtObject
中内嵌一个或者多个 qml 元素作为属性,有如下三种写法:
第一种比较常用:
property variant object: QtObject { // some property // some function}
直接使用 variant
对应的是 js 中 var
,很好用的一个东西。
注意,请在 Qt5 中使用
var
替代variant
第二使用一个list存储一个或多个qml元素实例:
property list<QtObject> // QtObject 可以替换为任何已经注册的或者自定义的元素类型 __listObject: [ QtObject{ id:a; property int _num: 100 } ]
第三种就是我今天看一位大神的代码才猛然醒悟的:
property QtObject __object: QtObject{ id:c; property int _num: 10000 }
yeatse/moebox
直接说明 property
是一个 QtObject
对象的实例。
第三种声明的属性其属性名指向的是一个实例化对象,并非是一个基本数据类型的值。所以对这样的属性进行赋值操作后,再打印其属性值是 undefined
。
还有一个,以上三种声明的属性的写法和qml的标准属性名是不一样的,qml 的标准属性名写法是开头必须是小写字母开头。而以下划线开头的写法是告诉大家,这个属性是 const private,不要随意变动他。
在新的Qt5(QtQuick2)中还有更多的特性,比如支持了在qml中定义枚举。
还有上诉的写法Qt 文档没有给出太多实例,只是在文档中说了一些(Qt4)
Any C++ data that is used from QML - whether as custom properties, or parameters for signals or functions -must be of a type that is recognizable by QML.By default, QML recognizes the following data types:boolunsigned int, intfloat, double, qrealQStringQUrlQColorQDate, QTime, QDateTimeQPoint, QPointFQSize, QSizeFQRect, QRectFQVariantQVariantList, QVariantMapQObject*Enumerations declared with Q_ENUMS()To allow a custom C++ type to be created or used in QML, the C++ class must be registered as a QML type using qmlRegisterType(), as shown in the Defining new QML elements section above.
最后这句话就说明了,只要通过 qml 的 注册函数 qmlRegisterType()
就能像第三种声明属性的方法那样将一个对象实例声明为属性。
神秘加成的默认属性
最后再提供一个好代码
//~ QObject.qmlQtObject { id: qObject /*! \qmlproperty QtObject QObject::data An object definition can have a single default property. A default property is the property to which a value is assigned if an object is declared within another object's definition without declaring it as a value for a particular property. \default */ default property alias data: qObject.__data /*! \internal */ property list<QtObject> __data}
QObject { id: qObject QObject{ } QtObject{ } Timer { } Settings{ } }
上诉代码来自 QObject.qml
- QML的property所支持的类型
- QML的 property 支持的类型
- 如何使用软件的方法来查找一个QML的类型的所有的property
- 在QML的UbuntuApplication Context Property
- qml 中支持的数据类型
- qml 中支持的数据类型
- Unity shader支持的Property
- 使用C++创建新的QML类型
- QML中使用C++的枚举类型
- D语言对property的支持
- @property扩号内支持的几个属性
- 使用C++拓展QML 类型及Property binding!
- Qt/QML开发支持下载的简单浏览器
- 使用C++创建新的QML类型(转载)
- mysql所支持的类型
- spring支持的AOP类型
- VBA支持的变量类型
- FDisk支持的文件系统类型
- Python基础——列表、元组、字典
- memset函数与二维数组初始化的问题
- 2015 Xcode7 真机调试(开发者)以及P12配置
- android:transcriptMode="normal" listview 设置这个属性 讲会滚动到最底一项
- 24 point game(ACM)
- QML的 property 支持的类型
- Spring Integration入门
- 快排中的partition函数
- xib简单使用.做个笔记,省的以后会忘掉......
- 使用matlab编译器生成EXE文件
- YTU:使用指针访问数组元素--程序填空
- wdatepicker.js
- 使用IntelliJ IDEA开发SpringMVC网站(三)数据库配置
- 关于结构体的一些理解