moc(mete object compiler)
- C++语言原生不支持反射(简单来说就是描述自身结构的信息,例如类名、函数有多少个参数之类的信息)
- moc准确来说是一个代码生成器,通过分析头文件(Qt的一些宏、信号、槽、属性等),生成对应的C++代码(包含类名字、信号函数、函数名字等信息)
- moc这种非原生C++的机制会引来一些争议(消耗更多、原理更复杂)
Q_OBJECT
#define Q_OBJECT \
public: \
static const QMetaObject staticMetaObject; \
virtual const QMetaObject *metaObject() const; \
virtual void *qt_metacast(const char *); \
virtual int qt_metacall(QMetaObject::Call, int, void **); \
QT_TR_FUNCTIONS \
private: \
static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
- moc会生成staticMetaobject的初始化代码,并且staticMetaObject是只读数据来的
- moc生成metaObject函数的定义,一般来说返回staticMetaObject(QML对象可能会返回另一个对象)
- qt_metacast通过类名字对比进行类型转换(qobject_cast本质上就是调用这个)
- qt_metacall调用到qt_static_metacall
- qt_static_metacall信号和槽的调用都放在这个函数里面
signals、slots、emit宏定义
#define slots Q_SLOTS
#define signals Q_SIGNALS
#define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot)
#define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal)
#define QT_ANNOTATE_ACCESS_SPECIFIER(x)
#define emit
简化一下本质上就是
//槽本质上什么都没有定义
#define slots
//信号就是一个public关键字
#define signals public
//emit本质上什么都没有定义 emit信号本质是调用信号函数
#define emit
这些关键字的本质是让moc识别处理槽和信号,生成信号函数体、生成对应信号槽的id并放在qt_static_metacall函数中调用
标签:metacall,Qt,Sginals,moc,static,Slots,qt,emit,define From: https://www.cnblogs.com/noexcept/p/17458655.html