Qt Sginals&Slots基本原理(1)

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 **);
  1. moc会生成staticMetaobject的初始化代码,并且staticMetaObject是只读数据来的
  2. moc生成metaObject函数的定义,一般来说返回staticMetaObject(QML对象可能会返回另一个对象)
  3. qt_metacast通过类名字对比进行类型转换(qobject_cast本质上就是调用这个)
  4. qt_metacall调用到qt_static_metacall
  5. 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函数中调用

posted @ 2023-06-05 20:03  zhaowenwei  阅读(66)  评论(0编辑  收藏  举报