Qt—元对象系统

x33g5p2x  于2022-03-28 转载在 其他  
字(1.1k)|赞(0)|评价(0)|浏览(258)

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关键字查看。

相关文章