信号和槽的其他说明和优缺点

🐌博主主页:🐌​倔强的大蜗牛🐌​

📚专栏分类:QT
❤️感谢大家点赞👍收藏⭐评论✍️

目录

一、信号与槽的断开 

二、使用Lambda 表达式定义槽函数 

1、局部变量引入方式 [ ]

2、函数参数 ( )

 3、选项Opt

4、Lambda表达式的返回值类型 ->

5、Lambda表达式的函数体 { }

6、槽函数使用Lambda表达式来实现 

三、信号与槽的优缺点  


一、信号与槽的断开 

使用disconnect 即可完成断开.
disconnect 的用法和 connect 基本一致.
示例:

 

二、使用Lambda 表达式定义槽函数 

Qt5 在 Qt4 的基础上提高了信号与槽的灵活性,允许使用任意函数作为槽函数。
但如果想方便的编写槽函数,比如在编写函数时连函数名都不想定义,则可以通过 Lambda表达式
来达到这个目的。
Lambda表达式 是 C++11 增加的特性。C++11 中的 Lambda表达式 用于定义并创建匿名的函数对
象,以简化编程工作。
Lambda表达式 的语法格式如下:
[ capture ] ( params ) opt -> ret {
        Function body;
};
capture捕获列表
params参数表
opt函数选项
ret返回值类型
Function body函数体

1、局部变量引入方式 [ ]

[ ] : 标识一个 Lambda表达式的开始。不可省略。
符号
说明
[ ]
局部变量捕获列表。Lambda表达式不能访问外部函数体的任何局部变量
[a]
在函数体内部使用值传递的方式访问a变量
[&b]
在函数体内部使用引用传递的方式访问b变量
[=]
函数外的所有局部变量都通过值传递的方式使用, 函数体内使用的是副本
[&]
以引用的方式使用Lambda表达式外部的所有变量
[=, &foo]
foo使用引用方式, 其余是值传递的方式
[&, foo]
foo使用值传递方式,其余引用传递
[this]
在函数内部可以使用类的成员函数和成员变量,= 和 & 形式也都会默认引⼊

 

说明:
  • 由于使用引用方式捕获对象会有局部变量释放了而Lambda函数还没有被调用的情况。如果执行Lambda函数,那么引用传递方式捕获进来的局部变量的值不可预知。所以绝大多数场合使用的形式为: [=] () { }
  • 早期版本的 Qt,若要使用Lambda表达式,要在 ".pro" 文件中添加: CONFIG += C++11因为 Lambda表达式 是 C++11 标准提出的。Qt5 以上的版本无需手动添加,在新建项目时会自动添加

示例1:Lambda表达式的使用 

示例2:以 [=] 方式传递,外部的所有变量在Lambda表达式中都可以使用

示例3:以 [a]方式传递,在Lambda表达式中只能使用传递进来的 a

2、函数参数 ( )

 (params) 表示 Lambda函数对象接收的参数,类似于函数定义中的小括号表示函数接收的参数类型和个数。参数可以通过按值(如:(int a,int b))和按引用(如:(int &a,int &b))两种方式进行传递。函数参数部分可以省略,省略后相当于无参的函数。

 3、选项Opt

Opt 部分是可选项,最常用的是 mutable 声明 ,这部分可以省略。
  
Lambda表达式外部的局部变量通过值传递进来时,其默认是 const,所以不能修改这个局部变量
的拷贝,加上mutable 就可以修改。

 

4、Lambda表达式的返回值类型 ->

可以指定 Lambda表达式返回值类型;如果不指定返回值类型,则编译器会根据代码实现为函数推导一个返回类型;如果没有返回值,则可忽略此部分。
示例:

5、Lambda表达式的函数体 { }

Lambda表达式的函数体部分与普通函数体一致。用  { } 标识函数的实现,不能省略,但函数体可
以为空。
示例:

 

6、槽函数使用Lambda表达式来实现 

示例:点击按钮关闭窗口;  

三、信号与槽的优缺点  

优点: 松散耦合
信号发送者不需要知道发出的信号被哪个对象的槽函数接收,槽函数也不需要知道哪些信号关联了自己,Qt的信号槽机制保证了信号与槽函数的调用。支持信号槽机制的类或者父类必须继承于 QObject类。

缺点: 效率较低
与回调函数相比,信号和槽稍微慢一些,因为它们提供了更⾼的灵活性,尽管在实际应用程序中差别不大。通过信号调用的槽函数比直接调用的速度慢约10倍(这是定位信号的接收对象所需的开销;遍历所有关联;编组/解组传递的参数;多线程时,信号可能需要排队),这种调用速度对性能要求不是非常高的场景是可以忽略的,是可以满足绝大部分场景。

 ❤️结语: 

本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,蜗牛必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!

  • 49
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

倔强的大蜗牛

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

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

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

打赏作者

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

抵扣说明:

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

余额充值