• 1.摘要
  • 2.系统介绍
  • 3.系统特性

元对象系统

元对象系统

元对象系统是一个编程术语。

系统介绍

Qt 元对象系统(Meta-Object System)

Qt的元对象系统基于如下三件事情:

1. 类:QObject,为所有需要利用元对象系统的对象提供了一个基类。

2. 宏:Q_OBJECT,通常可以声明在类的私有段中,让该类可以使用元对象的特性,比如动态属性,信号和槽。

3.编译器:元对象编译器(moc)为每个QObject子对象自动生成必要的代码来实现元对象特性。

moc工具会读入C++的源文件,如果它发现了一个或者多个声明了Q_OBJECT宏的类,它就创建另一个C++源文件,为每个类生成包含元对象实现的代码。这些编译生成的源文件通常都已经被包含到类的源文件中或者和类的实现同时被编译和链接。

系统特性

除了为对象间的通信提供信号和槽(signals and slots)机制之外,元对象的代码还提供下列特性:

· QObject::metaObject()返回与该类绑定的meta-object对象。

· QMetaObject::className()可以在运行时以字符串的形式返回类的名字,不需要C++编译器原生的运行时类型信息(RTTI)的支持。

· QObject::inherits()函数返回继承信息:对象是否是QObject继承树上一个类的实例。

· QObject::tr()和QObject::trUtf8()提供国际化支持,将字符串翻译成指定的语言。

· QObject::setProperty()和QObject::property()通过名字动态设置和获取对象属性。

· QMetaObject::newInstance()构造该类的一个新实例。

除此之外你还可以用qobject_cast()动态转换QObject类的类型。qobject_cast()函数和标准C++的dynamic_cast()功能类似,只是其不需要RTTI的支持,而且可以跨越动态连接库的边界。它尝试将它的参数cast成尖括号内的对象类型,如果对象是正确的类型(运行时决定)则返回非零,否则返回0,说明对象类型不兼容。

例如,假设MyWidget继承自QWidget,同时也声明了Q_OBJECT宏,

QObject *obj = new MyWidget;QObject类型的变量obj实际上指向一个MyWidget对象,因此我们可以这样进行类型转换:

QWidget *widget = qobject_cast(obj);到MyWidget的转型可以成功是因为qobject_cast()并没有对Qt内建对象和定制的扩展对象分别对待。