Qt之美(二):元对象

来源:互联网 发布:魔兽世界32位优化设置 编辑:程序博客网 时间:2024/04/29 23:08

本文的英文版在这里:http://xizhizhu.blogspot.com/2010/12/beauty-of-qt-2-meta-object.html

 

除了D指针,Qt中另一个很有意思的部分就是Q_OBJECT宏了。该宏提供了对元对象的访问,使得能够使用比如信号和槽等QObject的更多特性。元对象提供了诸如类名、属性和方法等的信息,也被称为“反射”。


通过使用QMetaObject,我们能够用如下代码显示一些类的信息:

 

 

由于C++并没有提供对这些信息的任何支持,Qt引入了元对象编译器(moc)来完成相应的工作。moc会读取每个头文件,如果发现其中定义的类是继承自QObject,且定义了Q_OBJECT宏,便会创建一个相应的C++源代码文件(moc_*.cpp),来完成这些工作。通过代码生成的工作,Qt不仅能够获得诸如Java等语言的灵活性,还能很好的保证继承自C++的性能和可扩展性

 

假设我们有如下所示的简单类:

 

 

moc会自动创建以下信息:

 

 

以上信息,及其基类的相关信息,都保存在该类对应的元对象中:

 

 

这样,如果我们希望对QObject的对象进行类型转换,就不需使用开销较大的运算符dynamic_cast, 而能够直接使用qobject_cast。该模板函数利用了元对象系统的信息,避免了在运行时进行类型转换:

 

 

这里,目标类型的元对象仅仅检查其是否从自身继承而来:

 

 

此外,moc会为每一个信号创建相应函数。当信号被emit时,该函数会被自动调用:

 

 

最后,这些信号都会通过moc创建的qt_metacall函数被调用:

 

原创粉丝点击