除了D指针,Qt中另一个很有意思的部分就是Q_OBJECT宏了。该宏提供了对元对象的访问,使得能够使用比如信号和槽等QObject的更多特性。元对象提供了诸如类名、属性和方法等的信息,也被称为“反射”。 由于C++并没有提供对这些信息的任何支持,Qt引入了元对象编译器(moc)来完成相应的工作。moc会读取每个头文件,如果发现其中定义的类是继承自QObject,且定义了Q_OBJECT宏,便会创建一个相应的C++源代码文件(moc_*.cpp),来完成这些工作。通过代码生成的工作,Qt不仅能够获得诸如Java等语言的灵活性,还能很好的保证继承自C++的性能和可扩展性。 假设我们有如下所示的简单类: moc会自动创建以下信息: 以上信息,及其基类的相关信息,都保存在该类对应的元对象中: 这样,如果我们希望对QObject的对象进行类型转换,就不需使用开销较大的运算符dynamic_cast, 而能够直接使用qobject_cast。该模板函数利用了元对象系统的信息,避免了在运行时进行类型转换: 这里,目标类型的元对象仅仅检查其是否从自身继承而来: 此外,moc会为每一个信号创建相应函数。当信号被emit时,该函数会被自动调用: 最后,这些信号都会通过moc创建的qt_metacall函数被调用:
通过使用QMetaObject,我们能够用如下代码显示一些类的信息:
Qt之美(二)元对象
原创xiesiyuana ©著作权
©著作权归作者所有:来自51CTO博客作者xiesiyuana的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:Qt之美(三)隐式数据共享
下一篇:Qt之美(一) D指针/私有实现
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Qt入门之概述
Qt6介绍、环境搭建、应用示例
Qt6 QtCreator C++ -
Qt之美(二):元对象
Qt之美(三):隐式共享
c++ 类名 类型转换 字符串 偏移量 -
【Qt开发流程】之元对象系统
【Qt开发流程】之元对象系统
qt 数据库 java Qt 信号与槽 -
【QT】QT元对象系统
QT元对象系统(Meta-Object-System)元对象系统元对象系统是一个基于标准C++的扩展,为
qt c++ 信号与槽 #include -
Qt的元对象系统
元对象系统:创建了独立的软件组织,这些组件可以绑定在一起,但任何一个组件对于它所要连接
Qt C C++ C# ITeye -
Qt(五)元对象特性
文章目录一、UI设计二、代码开发三、演示一、UI设计新建项目,主要选项如下图:一个QWidget,带ui文件,并初步Ui设计拖
qt 开发语言 #include ui设计 #ifndef