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的支持。

你可能感兴趣的:(Qt)