1,QT元对象系统简介
Qt的信号槽和属性系统具有运行时查询对象信息的能力,但是C++查询对象信息的能力比较有限,仅仅能够通过RTTI的typeid和dynamic_cast关键字来实现。
QT拓展了C++ 的这种能力,但是没有采用C++标准库的RTTI,而是提供了更为强大的元对象(meta object)机制,基于元对象,可以列出对象的方法和属性列表,并且能够获取有关对象的所有信息如参数类型。
QT中的元对象系统全称为Meta Object system,是一个基于C++标准库的扩展,为QT提供了一下信号与槽机制,实时类型信息,动态属性系统。
1)QObject类
作为每一个需要利用元对象系统的类的基类。
2)Q_OBJECT 宏
定义在每个类的头文件中,用来启用元对象功能,比如动态属性,信号和槽。
在一个QObject类或者其派生类中,如果没有声明这个宏,调用的metaObject()返回的就是其父类的metaobject对象,导致从类获取的元数据其实是父类的数据,因此,任何从QObject继承的类,都应该声明Q_OBJECT宏
3)元对象编译器MOC
MOC 会分析C++的头文件,如果发现Q_OBJECT宏定义,会动态生成一个moc_ 的C++源文件,源文件包含Q_OBJECT的实现代码,会被编译链接到类的二进制代码中,作为类的一部分。
2,元对象的功能
1)信号和槽,用于对象间的通信;
2)QObject::MetaObject()方法,获得与一个类相关联的meta-object
3)QMetaObjcet::className方法,在运行期间返回一个对象的类名,
4)QObject::inherits()方法,用来判断一个对象是不是从一个特定的类派生出来,必须是QObject的派生类
5)QObject::tr()和QObject::trUtf8() 为软件的而国际化翻译字符串
6)Qobject::setProperty()和Qobject::property() 根据属性名动态的设置和获取属性值
7)使用qobject_cast()方法在QObject类之间提供动态转换。