01QT元对象系统

文章目录

一、元对象系统

   元对象系统是一个基于标准C++的扩展,为Qt提供了信号与槽机制实时类型信息动态属性系统

元对象系统的三个基本条件:

1:类必须继承自QObject
2:类声明Q_OBJECT宏(默认私有有)
3:元对象编译器moc。

  信号和槽机制是 QT 的核心机制,信号和槽是一种高级接口,应用于对象之间的通信,它是QT的核心特性,信号和槽是QT自行定义的一种通信机制,它独立于标准的 C/C++ 语言,要正确的处理信号和槽,必须借助一个称为 moc(Meta-Object Compiler),也就是“元对象编译器”。,

它为高层次的事件处理自动生成所需要的必要代码。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果moc发现在一个类头文件中包含了宏 Q_OBJECT,则会生成以moc_className.cpp(自定义类名)的.cpp文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。新的文件同样将进入编译系统,与原文件一起参与编译。构建生成的.o文件包含moc生成的cpp文件。

Q_OBJECT定义在qobjectdefs.h文件中:
在这里插入图片描述

分析Q_OBJECT后,发现都是在操作元对象,并没有所谓的信号和槽,属性等内容,很显然,QObject对象能够支持这些功能,必然是通过QMetaObject这个元对象来实现的。
QMetaObject定义:元对象类包含的信息
在这里插入图片描述
Qt元对象系统为何一定要继承自QObject?
分析QObject类:
在这里插入图片描述
在这里插入图片描述
   所以,QObject之所以为元对象系统的基类,因其提供了元对象系统很多支持工作:
   信号与槽、事件处理、属性设置、国际化支持(翻译)、对象树资源管理等等。
   使用QObject作为基类而不使用Q_OBJECT宏和元对象代码是可以的,但是如果   Q_OBJECT宏没有被使用,那么这个类声明的信号和槽,以及其他特征描述都不会被调用。

元对象系统除实现信号与槽外,还有很多其他特性,比如:
   QObject::metaObject()返回与该类绑定的meta-object对象。
   QMetaObject::className()可以在运行时以字符串的形式返回类的名字,不需要C++编译器原生的运行时类型信息(RTTI)的支持。
   QObject::inherits()函数返回继承信息:对象是否是QObject继承树上一个类的实例。
   QObject::tr()和QObject::trUtf8()提供国际化支持,将字符串翻译成指定的语言。
   QObject::setProperty()和QObject::property()通过名字动态设置和获取对象属性。
   QMetaObject::newInstance()构造该类的一个新实例。
qObject_cast()动态类型转换。
   一般建议在QObject的所有子类中使用Q_OBJECT宏,而不管它们是否使用了信号与槽。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值