Qt的信号与槽 文章目录QT-信号与槽详解上概述、使用、自定义、连接方式、其他说明-CSDN博客QT-信号与槽详解下概述、使用、自定义、连接方式、其他说明-CSDN博客此篇作为信号与槽的总结篇信号和槽的其他说明1、信号与槽的断开使用disconnect即可完成断开disconnect的用法和connect基本不一致实际上大部分情况下把信号和槽连接上之后就不必在管了所以disconnect使用的比较少。主动断开往往是把信号重新绑定到另一个槽函数上2、Qt4版本信号与槽的连接Qt4中的connect用法和Qt5相比更复杂需要搭配SIGNAL和SLOT宏来完成而且缺少必要的函数类型的检查使代码更容易出错在 widget.h 头文件中声明信号和槽在 widget.cpp 文件中实现槽函数以及连接信号与槽1Qt4版本信号与槽函数连接的优缺点优点参数直观缺点参数类型不做检测3、使用Lambda表达式定义槽函数Qt5 在 Qt4 的基础上提高了信号与槽的灵活性允许使用任意函数作为槽函数。但如果想方便的编写槽函数比如在编写函数时连函数名都不想定义则可以通过 Lambda 表达式来达到这个目的。Lambda 表达式是 C11 增加的特性。C11 中的 Lambda 表达式用于定义并创建匿名的函数对象以简化编程工作。Lambda 表达式的语法格式如下[ capture ] ( params ) opt - ret { Function body; };1局部变量引入方式【】[ ] : 标识一个 Lambda 表达式的开始。不可省略说明由于使用引用方式捕获对象会有局部变量释放了而 Lambda 函数还没有被调用的情况。如果执行 Lambda函数那么引用传递方式捕获进来的局部变量的值不可预知。所以绝大多数场合使用的形式为[] () { }早期版本的 Qt若要使用 Lambda 表达式要在 .pro 文件中添加 CONFIG C11 因为 Lambda 表达式是 C11 标准提出的。Qt5 以上的版本无需手动添加在新建项目时会自动添加。Lambda 表达式的使用以 [] 方式传递外部的所有变量在 Lambda 表达式中都可以使用以 [a] 方式传递在 Lambda 表达式中只能使用传递进来的 aLambda 表达式除了可以按照值得方式来捕获变量 []还可以按照引用得方式来捕获 []但 Qt 中很少这样写捕获到的变量一般就是各自控件得指针。指针变量按照值传递或者引用来传递都无所谓。如果选择按照引用来传递还得更关注这个引用得变量本身的生命周期。2函数参数(params) 表示 Lambda函数对象接收的参数类似于函数定义中的小括号表示函数接收的参数类型和个数。参数可以通过按值如(int a,int b)和按引用如(int a,int b)两种方式进行传递。函数参数部分可以省略省略后相当于无参的函数。3选项OptOpt部分是可选项最常用的是mutable声明这部分可以省略。Lambda 表达式外部的局部变量通过值传递进来时其默认是const所以不能修改这个局部变量的拷贝加上 mutable 就可以修改。4Lambda表达式的返回值可以指定 Lambda表达式返回值类型。如果不指定返回值类型则编译器会根据代码实现为函数推导⼀个返回类型。如果没有返回值则可忽略此部分。5Lambda表达式的函数体{}Lambda 表达式的函数体部分与普通函数体一致。用 { } 标识函数的实现不能省略但函数体可以为空。6槽函数使用Lambda表达式来实现A. 点击按钮关闭窗口B. 当 connect 函数第三个参数为 this 时第四个参数使用 Lambda表达式时可以省略掉 this4、信号与槽的优缺点1优点松散耦合信号发送者不需要知道发出的信号被哪个对象的槽函数接收槽函数也不需要知道哪些信号关联了自己Qt 的信号槽机制保证了信号与槽函数的调用。支持信号槽机制的类或者父类必须继承于 QObject 类。2缺点效率较低与回调函数相比信号和槽稍微慢一些因为它们提供了更高的灵活性尽管在实际应用程序中差别不大。通过信号调用的槽函数比直接调用的速度慢约 10 倍这是定位信号的接收对象所需的开销遍历所有关联编组 / 解组传递的参数多线程时信号可能需要排队这种调用速度对性能要求不是非常高的场景是可以忽略的是可以满足绝大部分场景。⼀个客户端程序中最慢的环节往往是 “人”。假设本身基于回调的方式是 10us使用信号槽的方式是 100us。对于使用程序的人来说是感知不到的。