发布于: 2023-10-9最后更新: 2023-11-9字数 00 分钟

元对象系统moc

首先,给定一个示例:
Q_OBJECT 这个宏是Qt元对象的核心,查看它的展开如下:
相当于对于需要Qt信号槽机制的类,比如注册Qt的元对象(即Q_OBJECT),然后Q_OBJECT为这个类添加了一些列元对象结构和相应的函数接口,比如上面的核心staticMetaObjectqt_static_metacall .
查看该头文件编译后的moc_xx.cpp:
moc_xx.cpp源码
结合其中Qt生成的注释来理解:Moc编译器创建了一个包含信号和槽信息的元对象。这个元对象是MyWidget类的一部分,并包含了类名、信号和槽的名称、信号和槽的参数类型等信息。
元对象的结构
元对象的定义部分看起来是这样的:
可以看到,元对象包含了一些元数据,如类名、信号和槽的名称等。这些信息是在编译时由Moc编译器生成的,并存储在qt_meta_stringdata_MyWidgetqt_meta_data_MyWidget这两个静态变量中。
信号和槽的调用
元对象还包含一个qt_static_metacall函数,这个函数是用来调用信号和槽的。这个函数会接收一个指向QObject的指针、一个表示调用类型的枚举值(如InvokeMetaMethod)、一个表示被调用方法的索引以及一个参数列表。
在这个例子中,qt_static_metacall函数的实现是这样的:

转型中的地方政府:官员的激励与治理
转型中的地方政府:官员的激励与治理
Qt信号槽机制梳理
Qt信号槽机制梳理