Qt中的元对象系统

Qt中的元对象系统(Meta-Object System)提供了对象间通信的信号和槽机制,运行时类型信息和动态属性系统。元对象系统是基于以下三个条件的:

  1. 该类必须继承自QObject类
  2. 必须在类的私有声明区声明Q_OBJECT宏(在类定义时,如果没有指定public或private,则默认为private)
  3. 元对象编辑器Meta-Object Complier(moc),为QObject的子类实现元对象提供必要的代码

其中,moc攻击读取一个C++源文件,如果它发现一个或者多个类的声明中包含Q_OBJECT宏,便会另外创建一个C++源文件(就是在项目目中的debug目录下看到的以moc开头的C++源文件),其中包含了为每一个类生成的元对象代码。这些产生的源文件或者被包含进类的源文件中,或者和类的实现同时进行编译和链接。

元对象系统主要是为了实现信号和槽机制才被引入的,不过除了信号和槽机制以外,元对象系统还提供了其他的一些特性:

  • QObject::metaObejct()函数可以返回一个类的元对象,它是QMetaObject类的对象。
  • QMetaObject::className()函可以在运行时以字符串形式返回类名,而不需要C++编译器原生的运行时类型信息(RTTI)的支持。
  • QObject::inherits()函数返回一个对象是否是QObject继承树上一个类的实例的信息。
  • QObject::tr()和QObject::trUtf8()进行字符串翻译来实现国际化
  • QObject::setProperty()和QObject::property()通过名字来动态设置或者获取对象属性
  • QMetaObject::newInstance()构造该类的一个新实例

除了这些特性,还可使用qobject_cast()函数来对QObject类进行动态类型转换,这个函数的功能类似于标准C++中的dynamic_cast()函数,但它不在需要RTTI的支持。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值