属性系统、对象树和拥有权、元对象系统

属性系统:
Qt提供了强大的基于元对象系统的属性系统,可以在运行Qt的平台支持标准C++编译器。要在一个类中声明属性,该类必须继承自QObject类,而且还要在声明前使用Q_PROPERTY()宏:
Q_PROPERTY(type name
(READ getFunction[WRITE setFunction]|
MEMBER memberName [(READ getFunction | WRITE setFunction)])
[RESET resetFunction]
[NOTIFY notifySignal]
[REVISION int]
[DESIGNABLE bool]
[SCRIPTABLE bool]
[STORED bool]
[USER bool]
[CONSTANT]
[FINAL])
   其中type表示属性的类型,可以是QVariant支持的类型或者是用户自定义的类型。如果是枚举类型,则还需要使用Q_ENUMS()宏在元对象系统中进行注册,这样以后才可以使用QObject::setProperty()函数来使用该属性。
name就是属性的名称。READ后面是读取该属性的函数,这个函数是必须有的,而后面带有”[]”号的选项表示这些函数是可选的,一个属性类似于一个数据成员,不过添加了一些可以通过元对象系统访问的附加功能:
1、一个读(READ)操作函数。
2、一个可选的写(WRITE)操作函数。
3、如果没有指定READ操作函数,那么必须指定一个MEMBER变量关联,这样会使给定的成员变量变为可读/写的而不用创建READ和WRITE操作函数。
4、一个可选的重置(RESET)函数。
5、一个可选的通知(NOTIFY)信号。
6、一个可选的版本(REVISION)号。
7、可选的DESIGNABLE表示这个属性在GUI设计器的属性编辑器中是否可见。
8、可选的SCRIPTABLE表明这个属性是否可以被脚本引擎访问,默认值为true。
9、可选的STORED 表明是否在对象的状态被存储时也必须存储这个属性的值。
10、可选的USER表明这个属性是否被设计为该类的面向用户或者用户可编辑的属性。
11、可选的CONSTANT表明这个属性的值是一个常量。
12、可选的FINAL表明这个属性不能被派生类重写。
其中,READ、WRITE和RESET函数可以被继承,也可以是虚的;当在多继承时,他们必须继承自第一个父类。

对象树与拥有权:
Qt中使用对象树来组织和管理所有的QObject类与其子类的对象。当创建一个QObject时,如果使用了其他的对象作为其父对象,那么这个QObject就会被添加到父对象的children()列表中;当父对象被销毁时,这个QObject也会被销毁。

元对象系统:
Qt中的元对象系统提供了对象间通信的信号和槽机制,运行时类型信息和动态属性系统。元对象系统是基于以下3个条件的:
1、该类必须继承自QObject类;
2、必须在类的私有声明Q_OBJECT宏(在类定义时,如果没有指定public或private,则默认为private);
3、元对象编辑器为QObject的子类实现元对象特性提供必要的代码。


元对象系统主要是为了实现信号和槽机制才被引入的,不过除了信号和槽机制以外,元对象系统还提供了其他一些特性:
1、QObject::metaObject()函数可以返回一个类的元对象;
2、QMetaObject::className()可以在运行时以字符串形式返回类名,而不需要C++编辑器原生的运行时类型信息(RTT1)的支持;
3、QObject::tr()和QObject::trUtf8()进行字符串翻译来实现国际化;
4、QObject::setProperty()和QObject::property()通过名字来动态设置或者获取对象属性;
5、QMetaObject::newInstance()构造类的一个新实例;
还可以使用qobject_cast()函数对QObject类进行动态类型转化,这个函数的功能类似于标准C++的dynamic_cast()函数,但它不需要RTT1的支持。

 

你可能感兴趣的:(Qt,笔记)