简述
元对象系统(Meta-Object System)提供了:
1 信号与槽机制可用于对象间通信
2 运行时类别信息
3 动态属性系统。
元对象系统基于三个方面:
1 QObject类:为每个具体对象提供了一个公共的元对象系统的基类(根类)。
2 Q_OBJECT宏: 在类的私有部分声明这个宏可以启用元对象特性,例如:动态属性、信号与槽。
3 Meta-Object编译器(moc): 为每个QObject子类生成必要的代码来实现元对象特性。
moc工具会读取C++源文件,如果发现有包含Q_OBJECT宏的类声明,就生成另外一个包含这些类的元对象代码的C++源文件。(这就是QT自定义的关键字如何实现的,即通过文本扫描,将自定义的关键字根据自定义的规则进行编译,编译成纯C++代码)生成的源文件要么在类源文件里用#include包含,或者(更常见)与类的实现代码直接进行编译连接。
类属性
1 定义:
//类的附加信息,写在类的声明中,本质就是个宏定义罢了
//通过一对pair即name和value来定义,为class提供额外信息说明
Q_CLASSINFO("Author","Wang")
Q_CLASSINFO("Company","SWU")
Q_CLASSINFO("Team","Faze")
2 使用:见元对象
动态属性
1 创建:
//动态属性:其与c++成员变量最大的区别在于,能够在运行期间动态地往类中添加新的成员(属性)
//定义方法1:不关联,直接新建一个属性(指定类型和名称);可以指定类中写好的函数作为read/set等多个用途;一般还是习惯使用setproperty和property函数来读写属性
//READ表示读取property时使用哪个函数的返回值作为读取值,WRITE则是改写的函数(即意要读写此属性需通过Read和Write函数)
//NOTIFY表示property的值改变后触发某个指定信号,FINAL表示子类不继承此property
//CONSTANT则表示此property只可读,仅提供一个READ接口
Q_PROPERTY(bool sth READ getSth WRITE setSth NOTIFY sthChanged FINAL)
Q_PROPERTY(int sth2 READ sth2 CONSTANT)
//定义方法2:绑定到指定的成员变量,访问它就相当于访问绑定到的成员
Q_PROPERTY(QString name MEMBER name)
//定义方法3:在运行(类外)定义动态属性,必须要指定对象、属性名称以及属性值(可以是任意类型)
broky=new QPerson(20,"Helvijs");
broky->setProperty("id","Broky");
2 使用:
//更改动态属性和定义新的动态属性方法一致
broky->setProperty("id","Proky");
//按名称读取动态属性,动态属性可以转换为任意类型
QString hisName=p->property