标签:
深入了解Qt主要内容来源于Inside Qt系列,本文做了部分删改,以便于理解。在此向原作者表示感谢!
在Qt Meta Object System-元对象系统这篇文章中,从底层实现的源码剖析了元对象系统的机制,在这里就做一些补充。
Meta Object System的设计基于以下几个基础设施:
QObject类,作为每一个需要利用元对象系统的类的基类。也就是说只有继承QObject类才能使用MOS。
Q_OBJECT宏,定义在每一个类的私有数据段,用来启用元对象功能,比如,动态属性、信号和槽。
元对象编译器moc(Meta Object Compiler),如果一个头文件中包含Q_OBJECT宏定义,moc就会将该文件编译成C++源文件。该原文件包含了Q_OBJECT的实现代码,也被编译,最终链接到这个类的二进制代码中。因为它也是这个类的一部分。通常,这个新的C++原文件会再以前的C++原文件前面加上moc_作为新的文件名。
如下图所示:
除了提供在对象间通讯的机制外,元对象系统还包含以下几种功能:
QObject::metaObject()方法,获得与一个类相关联的meta-object。
QMetaObject::className()方法,在运行期间返回一个对象的类名,不需要本地C++编译器的RTTI(run time type information)支持。
QObject::inherits()方法,用来判断一个对象的类是不是从一个特定的类继承而来。
QObject::tr()、QObject::trUtf8(),为软件的国际化翻译字符串。
QObject::setProperty()、QObject::property(),根据属性名动态的设置和获取属性值。
使用qobject_cast()方法在QObject类之间提供动态转换,qobject_cast()方法的功能类似于标准C++的dynamic_cast(),但是qobject_cast()不需要RTTI的支持。在一个QObject类或者它的派生类中,如果不定义Q_OBJECT宏,那么这些功能将不能被使用。从meta-object的观点来看,一个没有定义Q_OBJECT宏的类与它最接近的那个祖先类是相同的。那么QMetaObject::className()方法返回的名字并不是该类的名字,而是与它最近接的那个祖先类的名字。所以,任何从QObject继承的类都必须定义Q_OBJECT宏。
深入了解Qt(二)之元对象系统(Meta-Object System)
标签:
原文地址:http://www.cnblogs.com/tgycoder/p/5524735.html