Qt中的元对象系统(Meta-bject System)
提供了对象间通信的信号和槽机制、运行时类型信息和动态属性系统。
元对象系统是基于以下3个条件的:
该类必须继承自QObject类;
必须在类的私有声明区声明Q_OBJECT宏(在类定义时,如果没有指定public或者private,则默认为private);
元对象编译器Meta-Object Compiler( moc)为QObject的子类实现元对象特性提供必要的代码。
其中, moc工具读取一个C++源文件,如果它发现一个或者多个类的声明中包含Q_OBJECT宏,则会另外创建一个C++源文件(就是在项目目录中的 debug目录下看到的以moc开头的C++源文件),其中包含了为每一个类生成的元对象代码。这些产生的源文件或者被包含进类的源文件中,或者和类的实现同时进行编译和链接。
元对象系统主要是为了实现信号和槽机制才被引入的,不过除了信号和槽机制以外,元对象系统还提供了其他一些特性:
QObject : : metaObject()函数可以返回一个类的元对象;
QMetaObject : :className()可以在运行时以字符串形式返回类名,而不需要C++编辑器原生的运行时类型信息(RTTI)的支持;
QObject : : inherits()函数返回一个对象是否是QObject继承树上一个类的实例的信息;
QObject : : tr()和 QObject : : trUtf8()进行字符串翻译来实现国际化;
QObject : : setProperty()和 QObject : : property()通过名字来动态设置或者获取对象属性;
QMetaObject : : newInstance()构造类的一个新实例。
除了这些特性,还可以使用qobject_cast()
函数对QObject类进行动态类型转换,这个函数的功能类似于标准C++中的dynamic_cast()
函数,但它不再需要RTTI的支持。这个函数尝试将它的参数转换为尖括号中的类型的指针,如果是正确的类型,则返回一个非零的指针;如果类型不兼容,则返回0。
Q0bject * obj = new Mywidget;
QWidget * widget = qobject_cast < QWidget* >(obj);
信号和槽机制是Qt的核心内容,而信号和槽机制必须依赖于元对象系统,所以它是Qt中很关键的内容。这里只是说明了它的一些应用,具体实现机制这里不再讲述。作为初学者,上面讲述的知识显得有些枯燥,读者也没有必要一次就把它搞得很明白,心中有个大概的印象就行了,以后有了一定的基础再来学习。元对象系统的知识可以在Qt中通过 The Meta-Object System关键字查看。