深入理解信号与槽

信号和槽机制是Qt编程的基础

1.信号和槽原理

信号与槽是Qt对象间通信的一种机制,是Qt的核心特性,也是Qt与其他应用框架最显著的区别。
在GUI编程中,当我们操作控件时,我们希望其他控件能知道作出反应,或者任何对象都可以和其他对象通信,简单来说,就是点击最大化,调用了MAX()这函数。
在有些较老的GUI框架中,实现这种通信是采用回调函数。回调函数是C语言函数的一种应用,但是回调函数存在两个缺陷。

  1. 我们不能保证持有回调函数的业务处理函数会使用正确的参数来调用回调函数的指针。
  2. 回调函数使得业务处理函数和回调函数紧密耦合,因为业务处理函数必须知道应该嗲用哪个回调函数指针。

      Qt提供了另外一种替代回调函数机制,信号与槽。Qt有很多预定的信号,我们可以继承QWidget等,添加自己的信号。还可以添加自己需要的槽来处理相应的信号。
      信号与槽机制是类型安全的:接收信号的槽的签名必须与信号的签名匹配(槽的参数可以少于信号的参数)因为签名是兼容的,编译器可以帮助我们检测类型不匹配的问题。信号和槽的连接是基于字符串的。
信号和槽是松耦合的:发出信号的类既不知道也不关心哪个槽接收信号。Qt的信号与槽机制保证,如果你连接了一个信号和槽,槽将在运行时以与信号相同类型的参数调用。信号和槽可以使用任意类型的参数,因为它们是完全类型安全的。

自定义信号参数为自定义参数类型或者为QMap,Qlist等

      Qt自定义的信号只支持简单的参数传递QString、QList等,如果想要自定义参数传递,或者使用复杂的参数需要注册Qt的数据类型。

  1. 第一种将数据进行包裹在QVariant中,保存通用性数据类型
    实例:结构体使用Q_DECLARE_METATYPE宏,让结构体放到QVariant,使用qRegisterMetaType进行注册,在槽函数中因为使用宏,可直接将QVariant赋值给结构体。实例链接
  2. 直接手动注册类型,待上传

信号和槽是非常优雅的观察者模式实现

如何使用信号和槽

大概通过语言可以分为四种。

  1. 仅仅使用Qt类库中的信号与槽。
  2. 使用Qt类库预定义的信号,自己去实现槽
  3. 使用自己定义的信号,来响应Qt预定义的槽
  4. 自己定义信号和槽,自己的信号连接自己的槽。

信号和槽的连接类型

作为connect的第5个参数,一般可以不用设置,
Qt::ConnectionType枚举定义了以下连接类型。
AutoConnection ,自动连接。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风赤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值