Qt中的元对象系统全称Meta Object System,是一个基于标准C++的扩展,为Qt提供了信号与槽机制、实时类型信息、动态属性系统。元对象系统基于QObject类、Q_OBJECT宏、元对象编译器MOC实现。
A、QObject 类
作为每一个需要利用元对象系统的类的基类。
B、Q_OBJECT宏
定义在每一个类的私有数据段,用来启用元对象功能,比如动态属性、信号和槽。
在一个QObject类或者其派生类中,如果没有声明Q_OBJECT宏,那么类的metaobject对象不会被生成,类实例调用metaObject()返回的就是其父类的metaobject对象,导致的后果是从类的实例获得的元数据其实都是父类的数据。因此类所定义和声明的信号和槽都不能使用,所以,任何从QObject继承出来的类,无论是否定义声明了信号、槽和属性,都应该声明Q_OBJECT 宏。
C、元对象编译器MOC (Meta Object Complier),
MOC分析C++源文件,如果发现在一个头文件(header file)中包含Q_OBJECT 宏定义,会动态的生成一个moc_xxxx命名的C++源文件,源文件包含Q_OBJECT的实现代码,会被编译、链接到类的二进制代码中,作为类的完整的一部分。
元对象系统引用反射的基本思想。所谓反射,就是指对象成员的自我检查。使用反射编程(reflection programming),就可以编写出通用的操作,可对有各种不同结构的类进行操作。使用通用的值存储器QVariant,就可以按照一种统一的方式来对基本类型和其它的普通类型进行操作。
简而言之,所谓的反射模式,就是通过自己来查看所有的属性,通