信号和槽(4)
信号和槽(4)
定义槽函数的时候,也是可以使用lambda表达式的
lambda表达式很多编程语言都支持,属于是“语法糖”
lambda表达式的本质:“匿名函数”,主要应用在“回调函数”的场景,一次性使用
可能会存在的问题如下:
connect(button,&QPushButton::clicked,this,[](){qDebug()<<"lambda表达式被执行";button->move();
})
lambda是回调函数,无法直接获取到上层作用域中的变量
lambda为了解决上述问题,引入“变量捕获”语法,通过这个,获取到外层作用域的变量
解决方案如下:
connect(button,&QPushButton::clicked,this,[button,this](){qDebug()<<"lambda表达式被执行";button->move(300,300);this->move(100,100);
})
如果当前lambda里面想要使用更多的外层变量咋办?
解决方案如下:
connect(button,&QPushButton::clicked,this,[=](){qDebug()<<"lambda表达式被执行";button->move(300,300);this->move(100,100);
})
[=]是把上层作用域所有的变量的变量名都进行捕获
应用场景:如果对应的槽函数比较简答,而且是一次性使用的,可以这么写
注意点:
需要确认lambda内部的变量是有意义的
QPushButton*button=new QPushButton(this);
这个变量是new出来的,生命周期跟随整个窗口(挂到对象树上,窗口关闭才会释放)
lambda表达式也可以引用(&)的方式捕获,这个很少用到,用到的时候就需要关注生命周期
lambda表达式的语法是C++11才引入的,对于QT5及其更高的版本,默认是按照C++11的语法进行编译
对于使用QT4或者更老版本需要在.pro文件中手动添加上C++11的编译选项
,默认是按照C++11的语法进行编译
对于使用QT4或者更老版本需要在.pro文件中手动添加上C++11的编译选项