信号和槽机制(Signal & Slot)

1、Qt 提供了信号与槽的机制用于完成界面操作的相应,是完成任意两个Qt对象之间的通信机制。
2、当一个类被继承时,该类的信号与槽也同时被继承,也可以根据需要自定义信号与槽。
3、信号与槽机制的连接方式:
(1)一个信号可以与另一个信号相连,代码如下:

connect(Object1, SIGNAL(signal1), Object2, SIGNAL(signal1));

(2)同一个信号可以连接多个槽,代码如下:

connect(Object1, SIGNAL(signal2), Object2, SIGNAL(slot2));
connect(Object1, SIGNAL(signal2), Object3, SIGNAL(slot1));

(3)同一个槽可以响应多个信号,代码如下:

connect(Object1, SIGNAL(signal2), Object2, SIGNAL(slot2));
connect(Object3, SIGNAL(signal2), Object2, SIGNAL(slot2));

但是常用的连接方式是:

connect(Object1, SIGNAL(signal2), Object2, SLOT(slot));

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

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

5、信号与槽机制的优点
(1)类型安全。需要关联的信号和槽的签名必须是等同的,即信号的参数类型和参数个数 与 接收信号的槽的参数类型和参数个数要相同。不过,一个槽的参数个数是可以少于信号的参数个数的,但缺少的参数必须是信号参数的最后一个或几个参数。如果信号和槽的签名不符,编译器就会报错。
(2)松散耦合。信号和槽机制减弱了Qt对象的耦合度。激发信号的Qt对象无须知道是哪个对象的哪个槽需要接收它发出的信号,它只需做的是在适当时间发送适当的信号就好了,而不需要知道也不关心它的信号有没有被接收到,更不需要知道哪个对象的哪个槽接收到了信号。同样,对象的槽也不知道是哪些信号关联了自己,而一旦关联了信号和槽,Qt就保证了适当的槽得到了调用。即使关联的对象在运行时被删除,应用程序也不会崩溃。
6、一个类要支持信号和槽,就必须从QObject或QObject的子类继承。注意:Qt信号和槽机制不支持对模板的使用。

7、信号和槽机制的效率:
信号和槽机制增强了对象间通信的灵活性,然而这也损失了一些性能: 同 回调函数 相比,信号和槽机制运行速度有些慢。通常,通过传递一个信号来调用槽函数 将会比 直接调用非虚函数运行速度慢10倍。
(原因:(1)需要定位接收信号的对象;(2)安全遍历所有的关联;(3)编组/解组传递的参数;(4)多线程的时候,信号可能需要排队等候)
然而,与 创建堆对象的 new 操作及删除堆对象的delete操作 相比,信号和槽的运行代价只是它们很少的一部分。信号和槽机制导致的这点性能损耗,对实时应用程序是可以忽略的;同信号和槽提供的灵活性和简便性相比,这点性能的损失也是值得的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值