• 34.C++-QT信号槽分析


    moc  元对象编译器, 全称是 Meta-Object Compiler,也就是“元对象编译器”。是QT翻译扩展语法到C++语言的工具,目前见扩展了信号与槽机制。 

    信号/槽方式编程上更方便(不容易出错)

    回调需要自行处理麻烦的回调管理,稍微不注意就出错。

    而且信号/槽方式更利于mvc分离实现。

    信号和槽机制的优点:

    类型安全, 关联的信号和槽的参数必须是等同。

    降低Qt对象间的耦合度,只需要emit,对象无需知道哪个对象来接收该信号,

    信号槽的效率和回调函数相比,变低10倍, 原因如下:

    • 1)需要定位接收信号的对象。
    • 2)遍历所有的关联(如一信号对多槽)
    • 3)传递的参数
    • 4)多线程的时候。信号可能需要排队等待。 

     

    1.信号和槽实现

    1.Q_OBJECT

    Q_OBJECT展开后,会有一个QMetaObject元对象静态类、还有一些元对象操作函数:

     

    signals和slots:

    我们以这为例:

     

    预处理之前会调用moc程序,对文件预处理之后生成一个moc_xxx.cpp文件.

    如下图所示:

     

    moc会将signals和slots下的函数名转换为字符数组.并生成一个名称idx索引号.

    然后生成一个qt_meta_data_Widget(由于类名是Widget,所以后缀是Widget)数组:

     

    其中4,   14,表示有4个方法,然后14表示unit偏移位置,即qt_meta_data_Widget[14]就是第一个方法.

    然后并创建一个qt_static_metacall回调函数,实现调用目标类指针的槽函数:

     

    当我调用emit信号时,其实就是调用moc实现的一个信号函数, 信号函数内部调用了QMetaObject::activate()函数:

     

    而activate函数就会去QObjectConnectionListVector连接链表容器里面查找信号对应的索引号所在的值,里面存放了每个接受对象指针和槽函数id的链表:

     

    然后遍历该信号关联的链表里的所有目标对象指针和槽函数,并调用qt_static_metacall回调函数,实现调用槽函数.

     

    connect:

    connect会将信号和槽函数字符串化, 然后执行connect的时候会判断信号槽参数是否一致.并遍历”信号槽”字符串的索引号.如果索引号都定义了,则在发送方的连接链表容器的信号索引处,添加一个目标对象指针和槽函数索引号的类到链表中.


    人间有真情,人间有真爱。

    如果您喜欢这里,感觉对你有帮助,并且有多余的软妹币的话,不妨投个食吧,赞赏的时候,留下美句和你的博客地址哦~   戳这里看谁投食了


  • 相关阅读:
    全国最全的省,市,县,电话号前缀,邮编数据
    数组的高级用法
    Maven Project configuration is not up-to-date with pom.xml错误解决方法
    HighCharts开发说明
    Java基础复习之二:运算符,键盘录入,流程控制语句,if语句,三元运算
    Java基础复习之一篇:关健字,标识符,注释,常量,进制转换,变量,数据类型,数据类型转换
    ehcache 缓存技术
    Write operations are not allowed in read-only mode
    浮点运算与boost.multiprecision
    关于OpenCASCADE数组序列的起始值
  • 原文地址:https://www.cnblogs.com/lifexy/p/14948135.html
Copyright © 2020-2023  润新知