当前位置: 首页 > article >正文

Qt 信号与槽机制

Qt 信号与槽机制

    • 信号与槽机制的连接方式
    • 信号与槽机制的优点
    • 信号与槽机制的效率

QT提供了信号与槽机制用于完成界面操作的响应,信号与槽机制是完成任意两个QT对象之间的通信机制。

信号(Signal) 就是在特定情况下被发射的事件,例如PushButton 最常见的信号就是鼠标单击时发射的 clicked() 信号,一个 ComboBox 最常见的信号是选择的列表项变化时发射的 CurrentIndexChanged() 信号。GUI 程序设计的主要内容就是对界面上各组件的信号的响应,只需要知道什么情况下发射哪些信号,合理地去响应和处理这些信号就可以了。

槽(Slot) 就是对信号响应的函数。槽就是一个函数,与一般的C++函数是一样的,可以定义在类的任何部分(public、private 或 protected),可以具有任何参数,也可以被直接调用。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

信号与槽机制的连接方式

  • 基本格式
connect(Object1,SIGNAL(signal1),Object2,SLOT(slot2));
  • 一个信号可以和另一个信号相连
connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal2));

Object1的信号1发送可以触发Object2的信号2发送

  • 同一个信号可以和多个槽相连
connect(Object1,SIGNAL(signal1),Object2,SLOT(slot2));
connect(Object1,SIGNAL(signal1),Object3,SLOT(slot3));
  • 同一个槽可以响应多个信号
connect(Object2,SIGNAL(signal2),Object1,SLOT(slot1));
connect(Object3,SIGNAL(signal3),Object1,SLOT(slot1));

SIGNAL() 和 SLOT()是Qt定义的两个宏,它们返回其参数的C语言风格的字符串(const char*)。因此,下面关联的信号和槽的两个语句是等同的:

connect(buttoon, SIGNAL(clicked()), this, SLOT(showArea()));
connect(buttoon, "clicked()", this, "showArea()");

信号与槽机制的优点

  • 类型安全

关联的信号与槽的签名必须是等同的,也就是信号的参数类型和参数个数与接收该信号的槽的参数类型和参数个数相同。不过槽的参数个数可以少于信号的参数个数,但是缺少的参数必须是信号参数的最后一个或多个。

  • 松耦合

信号和槽机制减弱了QT对象的耦合度。激发信号的对象无须知道是哪些对象的哪些槽需要对其相应,也不关心信号有没有被接收到。同样的槽也不知道哪些信号关联了自己。一旦关联信号和槽,QT就保证了适合的槽得到了调用。

一个类若要支持信号和槽,就必须从QObject或QObject的之类继承。信号和槽不支持对模板的使用。

信号与槽机制的效率

信号与槽机制增强了对象间通信的灵活性,这也损失了一些性能主要原因如下,但是相比之下这点性能损失是值得的

  • 需要定位接收信号的对象
  • 安全地遍历所有的关联(一个信号对多个槽)
  • 编组与解组传递的参数
  • 在多线程时,信号可能需要排队

http://www.kler.cn/a/16431.html

相关文章:

  • MySQL —— MySQL逻辑架构与查询过程
  • Java算法OJ(7)随机快速排序
  • Springboot配置全局异常通用返回
  • 学习记录:js算法(九十二):克隆图
  • Could not initialize class sun.awt.X11FontManager
  • Vue 的生命周期函数 和 Vuex
  • keepalived脑裂现象
  • Android Input系统事件分发分析
  • 题目 3166: 蓝桥杯2023年第十四届省赛真题-阶乘的和--不能完全通过,最好情况通过67.
  • “双碳”目标下二氧化碳地质封存技术应用前景及模型构建实践方法与讨论
  • 设备仪器仪表盘读数识别算法 yolov5
  • Eplan 部件库导入部件的方法
  • 自动化运维工具Ansible之playbooks剧本
  • Nginx原理解析
  • (基础算法)高精度加法,高精度减法
  • 【C语言】struct结构体
  • Linux拓展:链接库
  • 数据结构(六)—— 二叉树(3)
  • 【Linux多线程编程-自学记录】05.取消线程
  • Tomcat8和Tomcat9乱码问题
  • 浪潮之巅 OpenAI有可能是历史上第一个10万亿美元的公司
  • 一篇带你了解大厂都在用的DDD领域驱动设计
  • 【Canvas入门】从零开始在Canvas上绘制简单的动画
  • 高性能定时器介绍及代码逐行解析--时间堆
  • 走进小程序【十一】微信小程序【使用Echarts 和 腾讯地图】
  • R语言 | 数据框