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的时候会判断信号槽参数是否一致.并遍历”信号槽”字符串的索引号.如果索引号都定义了,则在发送方的连接链表容器的信号索引处,添加一个目标对象指针和槽函数索引号的类到链表中.

Original: https://www.cnblogs.com/lifexy/p/14948135.html
Author: 诺谦
Title: 34.C++-QT信号槽分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535198/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 对指针和引用的理解(c++)

    1.指针 typedef说明一种新类型名,来代替已有类型名。 a.案例:typedef char String_t和#define String_d char 这两句在使用上的区别…

    C++ 2023年5月29日
    066
  • 谷歌开源替代 C++ 的编程语言:Carbon

    谷歌工程师 Chandler Carruth 近日在多伦多举办的 CppNorth 大会上宣布,正式开源谷歌内部打造的编程语言:Carbon,并称 Carbon 是 C++ 的继任…

    C++ 2023年5月29日
    080
  • C++ 虚继承

    转自:http://www.cppblog.com/chemz/archive/2007/06/12/26135.html 虚继承和虚基类的定义是非常的简单的,同时也是非常容易判断…

    C++ 2023年5月29日
    079
  • 2.设计模式-七大原则(C++)

    任何一个设计模式都离不开七大原则中的任一原则.所以七大原则非常重要,只要我们明白了七大原则,就可以知道如何在项目中使用什么设计原则了. 设计模式的七大原则如下所示: 1.单一职责原…

    C++ 2023年5月29日
    057
  • c++ union内存

    看一个例子: 输出结果: 为什么是这样的呢? 因为A是union,所以在内存中存储的格式为: 高地址 ————> 低地址 12…

    C++ 2023年5月29日
    061
  • C++实现二次、三次B样条曲线

    下面是一个有四个控制点的Bezier 曲线: 可以通过改变一个控制点的位置来改变曲线的形状,比如将上图曲线中左边第二个控制点往上移,就可以得到下面的曲线: 可以看到,这种曲线生成方…

    C++ 2023年5月29日
    047
  • std::get<C++11多线程库~线程管理>(09):运行时决定线程数量

    1 #include 2 #include 3 #include 4 #include 5 #include 6 7 /* 8 * 话题1: 运行时决定线程的数量。 9 * 线程的…

    C++ 2023年5月29日
    043
  • 关于C/C++中求最大公约数和最小公倍数的算法

    1.更相减损法 int gcd(int a,int b) { while(a!=b) { if(a>b) a-=b; else b-=a; } return a; } 2.辗…

    C++ 2023年5月29日
    063
  • 【面试攻略】C++面试-点点互动

    2020-11-23-点点互动 自我介绍 1.redis的数据结构和优化 https://blog.csdn.net/weixin_43631706/article/details…

    C++ 2023年5月29日
    062
  • c++ 异常 discards qualifiers 丢弃

    src/feedbackservice.cpp:76: error: passing const ps::spider::urlreceiver::entry::ConfigMan…

    C++ 2023年5月29日
    049
  • C++ 回调函数(CallBack)的用法分析

    本文实例分析了C++中回调函数(CallBack)的用法。分享给大家供大家参考。具体分析如下: 如果试图直接使用C++的成员函数作为回调函数将发生错误,甚至编译就不能通过。其错误是…

    C++ 2023年5月29日
    055
  • C++源码—_Ptr_base(MSVC 2017)

    1 _Ptr_base _Ptr_base 是智能指针的基类,它包含两个成员变量: 指向目标元素的指针 _Ptr 和 引用计数基类指针 _Rep。 _Ptr 指向的元素类型为 us…

    C++ 2023年5月29日
    075
  • C++接口设计和代码重构

    讲了接口设计, 文档(doxygen),测试等方面。对于从头编写基础库, 或者没有基础库开发经验并且需要短期内上手, 有一定实际参考价值。 所谓Mikado Method方法是用来…

    C++ 2023年5月29日
    060
  • [招聘]高级软件工程师(C/C++), 惠州大亚湾,BYD

    岗位职责: 参与工业基础软件技术方案的调研,制定软件模块方案 开发基于Linux的工控自动化通用平台软件模块 相关技术文档的编写 其他相关的工作任务 任职要求:1. 3 年以上 C…

    C++ 2023年5月29日
    079
  • [C++] const与重载

    下面的两个函数构成重载吗? cpp;gutter:true; void M(int a){} //(1) void M(const int a){} //(2)</p>…

    C++ 2023年5月29日
    094
  • C++11中的右值引用及move语义编程

    C++0x中加入了右值引用,和move函数。右值引用出现之前我们只能用const引用来关联临时对象(右值)(造孽的VS可以用非const引用关联临时对象,请忽略VS),所以我们不能…

    C++ 2023年5月29日
    067
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球