做网站开发还会有前途吗杭州专业网站制作设计
🐌博主主页:🐌倔强的大蜗牛🐌
📚专栏分类: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倍(这是定位信号的接收对象所需的开销;遍历所有关联;编组/解组传递的参数;多线程时,信号可能需要排队),这种调用速度对性能要求不是非常高的场景是可以忽略的,是可以满足绝大部分场景。 
 
❤️结语:
本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,蜗牛必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!
