信号与槽
一.带参数的信号和槽
- Qt的信号和槽也⽀持带有参数,同时也可以⽀持重载.
- 此处我们要求,信号函数的参数列表要和对应连接的槽函数参数列表⼀致.(一致指的是类型一致,如果个数不一致,那么信号参数个数要比槽个数的参数多)
- 此时信号触发,调⽤到槽函数的时候,信号函数中的实参就能够被传递到槽函数的形参当中.
前面提到信号的参数比槽的参数多,为什么要这样设置呢?这是因为槽和信号可以多对多绑定,如果我们严格要求参数一致,那么意味着信号绑定槽的要求更高了。换而言之,就是为了让槽和信号的绑定更加灵活。
二.信号与槽的多对多连接
三.信号与槽的断开
使⽤disconnect即可完成断开.disconnect的⽤法和connect基本⼀致。但是该函数很少被使用,一般而言我们断开该信号的连接是为了与其它槽相连,除此之外基本connect后就不再管了。
创建两个按钮,第一个按钮改变标题,第二个按钮断开第一个按钮的连接,让第一个按纽改变另一个标题
四.lamda表达式定义槽函数
Qt5在Qt4的基础上提⾼了信号与槽的灵活性,允许使⽤任意函数作为槽函数。但如果想⽅便的编写槽函数,⽐如在编写函数时连函数名都不想定义,则可以通过Lambda表达式来达到这个⽬的。
Lambda表达式是C++11增加的特性。C++11中的Lambda表达式⽤于定义并创建匿名的函数对象,以简化编程⼯作。
lambda表达式不再多说,如果不了解,可以看我的博客c++11新特性部分。
说明:
- 由于使⽤引⽤⽅式捕获对象会有局部变量释放了⽽Lambda函数还没有被调⽤的情况。如果执⾏
Lambda函数,那么引⽤传递⽅式捕获进来的局部变量的值不可预知。所以绝⼤多数场合使⽤的形式为: [=] () { } - 早期版本的Qt,若要使⽤Lambda表达式,要在".pro"⽂件中添加: CONFIG += C++11 因为Lambda表达式是C++11标准提出的。Qt5以上的版本⽆需⼿动添加,在新建项⽬时会⾃动添加
问题
当我们在表达式里调用上层变量时,是无法成功的。
因为在c++里,lambda是一个回调函数,所以如果没对它进行参数捕获,它就无法调用其它函数里的变量。这里其实是c++的知识,也就不再多说了,不了解可以看我的博客c++11新特性部分。