码迷,mamicode.com
首页 > Web开发 > 详细

深入了解Qt(二)之元对象系统(Meta-Object System)

时间:2016-05-24 22:27:41      阅读:999      评论:0      收藏:0      [点我收藏+]

标签:

深入了解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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!