zoukankan      html  css  js  c++  java
  • Qt信号槽源码剖析(二)

    大家好,我是IT文艺男,来自一线大厂的一线程序员

    上节视频给大家讲解了Qt信号槽的基本概念、元对象编译器、示例代码以及Qt宏;今天接着深入分析,进入Qt信号槽源码剖析系列的第二节视频。

    Qt信号槽的宏使用

    宏定义在qobjectdefs.h文件中(位于QtCore目录)

    signals

    #define signals Q_SIGNALS
    #define Q_SIGNALS public QT_ANNOTATE_ACCESS_SPECIFIER(qt_signal)
    #define QT_ANNOTATE_ACCESS_SPECIFIER(x)
    

    推导出来的结果如下,即signals就是public

    #define signals public
    

    slots

    #define slots Q_SLOTS
    #define Q_SLOTS QT_ANNOTATE_ACCESS_SPECIFIER(qt_slot)
    #define QT_ANNOTATE_ACCESS_SPECIFIER(x)
    

    推导出来的结果如下,即slots为空

    #define slots
    

    Q_OBJECT

    #define Q_OBJECT 
    public: 
        QT_WARNING_PUSH 
        Q_OBJECT_NO_OVERRIDE_WARNING 
        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: 
        Q_OBJECT_NO_ATTRIBUTES_WARNING 
        Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **); 
        QT_WARNING_POP 
        struct QPrivateSignal {}; 
        QT_ANNOTATE_CLASS(qt_qobject, "")
    

    Q_OBJECT声明一些函数以及一个静态的QMetaObject对象, 这些函数的实现位于MOC所产生的源文件中;因此,这些函数的声明与实现就都有了;
    精简版如下所示::

    #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: 
        Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);
    

    emit

    emit宏为一个空宏; 它甚至没有被MOC解析,换句话说,emit只是可选的,没有任何意义(除了给开发人员一个提示)。

    #define emit
    

    SIGNAL

    #ifndef QT_NO_DEBUG
    #define QLOCATION "" __FILE__ ":" QT_STRINGIFY(__LINE__)
    #define SIGNAL(a)   qFlagLocation("2"#a QLOCATION)
    #else
    #define SIGNAL(a)   "2"#a
    #endif
    

    SLOT

    #ifndef QT_NO_DEBUG
    #define QLOCATION "" __FILE__ ":" QT_STRINGIFY(__LINE__)
    #define SLOT(a)     qFlagLocation("1"#a QLOCATION)
    #else
    #define SLOT(a)     "1"#a
    #endif
    

    对于这些宏,下节视频我会讲解MOC以及预处理之后的代码与初始代码的对比来帮助大家更好的理解;

    今天就讲解到这里,更详细的原理分析与讲解,请关注微信公众号(itwenyinan),观看对应的的视频版讲解;谢谢

  • 相关阅读:
    【leetcode】1324. Print Words Vertically
    【leetcode】1323. Maximum 69 Number
    【leetcode】1320. Minimum Distance to Type a Word Using Two Fingers
    【leetcode】1319. Number of Operations to Make Network Connected
    7系列GTX中的疑惑
    8b10b
    hB
    MATLAB实现最优低通滤波器的函数
    modelsim读写TXT文件
    ILA用法
  • 原文地址:https://www.cnblogs.com/appsucc/p/14651309.html
Copyright © 2011-2022 走看看