1. 带参数的信号与槽
上一篇文章讲了自定义槽和信号的方式,举例个简单了例子去学习了基本的语法,其中提到了信号和槽都是可以带参数的。
当信号带有参数的时候,槽的参数必须和信号的类型对应一致,这里的一致是类型,数量上可以不一样,但必须是信号函数的参数个数大于槽函数的参数个数,此时发送信号的时候,就可以给信号函数传递实参,这个给信号函数传送的实参会被传递到槽函数中。
举个例子:clicked信号中就重载了一个带参数的,clicked(bool)这个应用场景是在关联复选框的时候,这个参数就是这个复选框是否被勾选的状态值,通过这个参数就可以告诉槽函数此时复选框的状态,当被点击的时候,根据具体状态执行不同行为。
为什么参数个数可以不一致,而不弄成严格一致?
这种设计是为了让一个槽函数可以被多个不同信号绑定,而一个信号也可以绑定多个槽函数,这种多对多的模式,也是这个信号与槽最初的设计理念,这种信号与槽用connect链接起来的机制,最初是为了实现解耦合,以及“多对多”模式的效果,但实际开发过程中,往往一对一的模式就可以满足绝大多数的开发需求,所以这不算是Qt特别领先的地方,只能说是一直特色。
2. disconnect 断开信号槽连接
disconnect的作用就是用来断开信号槽连接的,但是通常比较少用,因为信号和槽是可以多对多连接的,往往用到的时候就是需要断开原先的槽去连接新的槽,这两个槽的功能有冲突的情况。
disconnect在用法上和connect是一致的,同样四个参数,前两个描述信号,后两个描述槽,作用相反。
简单来设计一个例子:创建一个按钮,这个按钮可以将界面标题修改成“标题一”,然后再创建一个按钮,这个按钮能够使得让原先的按钮切换槽连接,使得其功能变成将界面标题修改成“标题二”
1)先创建好两个不同的槽函数
2)创建按钮,先链接其中一个槽函数
3)我们再创建一个按钮去关联一个用于切换这个按钮的槽函数,使得将按钮一切换成按钮二,而按钮二除了名字变化,还需要它断开原先的槽函数,去连接新的槽函数
3. lambda表达式定义槽函数
在C++11后,是允许lambda表达式去定义回调函数的,其实就是匿名函数,在一些简单的槽函数时,就可以用lambda表达式,这里还涉及到一些语法细节
变量捕获就是这个匿名函数要对上层的变量进行使用的话,需要进行变量捕获,不然无法使用,例如button、this这些,如果直接写【=】的话,就是将外面的所有变量都捕获的意思,也可以使用【&】表示引用,但通常不用,因为需要关注捕获变量的生命周期。
lambda表达式是C++11以后出现的语法,在Qt5以后可以直接使用,Qt5之前需要包含C++11的编译选项“CONFIG += C++11”
总结
本篇总结了带参数的信号与槽的语法规则,断开信号槽连接的函数disconnect,以及lambda表达式在槽函数中的应用。