• 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),观看对应的的视频版讲解;谢谢

  • 相关阅读:
    Diango基础学习
    Python02-作业(购物车)
    使用spring boot + Thymeleaf实现web小页面
    Python-01作业(登录和三级菜单)
    Java反射机制
    Socket编程
    利用java的url实现小型的网页爬虫
    关于在spring boot里使用Thymeleaf模板的application.properties配置
    Spring
    Spring-bean的自动装配
  • 原文地址:https://www.cnblogs.com/appsucc/p/14651309.html
Copyright © 2020-2023  润新知