元对象系统moc
首先,给定一个示例:
Q_OBJECT
这个宏是Qt元对象的核心,查看它的展开如下:相当于对于需要Qt信号槽机制的类,比如注册Qt的元对象(即Q_OBJECT),然后Q_OBJECT为这个类添加了一些列元对象结构和相应的函数接口,比如上面的核心
staticMetaObject
、qt_static_metacall
.查看该头文件编译后的moc_xx.cpp:
moc_xx.cpp源码
结合其中Qt生成的注释来理解:Moc编译器创建了一个包含信号和槽信息的元对象。这个元对象是
MyWidget
类的一部分,并包含了类名、信号和槽的名称、信号和槽的参数类型等信息。元对象的结构
元对象的定义部分看起来是这样的:
可以看到,元对象包含了一些元数据,如类名、信号和槽的名称等。这些信息是在编译时由Moc编译器生成的,并存储在
qt_meta_stringdata_MyWidget
和qt_meta_data_MyWidget
这两个静态变量中。信号和槽的调用
元对象还包含一个
qt_static_metacall
函数,这个函数是用来调用信号和槽的。这个函数会接收一个指向QObject的指针、一个表示调用类型的枚举值(如InvokeMetaMethod)、一个表示被调用方法的索引以及一个参数列表。在这个例子中,
qt_static_metacall
函数的实现是这样的:- 作者:Olimi
- 链接:https://olimi.icu/article/827a5e01-9e52-4d61-8df5-45fca9d39966
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。