简介
Lambda表达式用于创建一个匿名的函数。
注意
-
C++11后才有的特性
-
在Qt5.4之前的版本包括5.4,都需要在pro文件中加入
CONFIG += c++11
才可以使用。5.4以后可加可不加。
写法
函数声明[ ] ( ){ };,函数声明且调用[ ] ( ){ }( );
-
[ ],标识一个lambda表达式的开始,不能省略
参数形式(可以写多个,用‘,‘逗号分割)
- 空,没有任何参数
- =,函数体内可以使用lambda所在作用范围内的所有可见的局部变量(包括this),是值传递的方式
- &,函数体内可以使用lambda所在作用范围内的所有可见的局部变量(包括this),是引用传递的方式
- a,将a进行值传递
-
[ ]( ) mutable { };可以修改值传递的拷贝。lambda表达式默认是只读,就算是局部变量也不允许修改。
-
返回值 [ ] ( )->参数类型{ };
int a = []()->int{return 10000;}();
使用代码
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>
#include <QPushButton>
//Teacher类
//Student类
//下课后老师会触发一个信号(饿了),学生响应信号(请客吃饭)
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师的对象
this->th = new Teacher();
//创建一个学生的对象
this->stu = new Student();
resize(400,400);
//lambda可以为连接时添加参数,或调用更多函数
QPushButton * btn2 = new QPushButton(this);
btn2 ->setText("学习按钮");
btn2 -> move(0,30);
//若第三个参数是this,第四个参数是lambda表达式的话,可以省略this
//此处[ ]中若用&,修改参数值时,会因为锁的原因是程序挂掉
connect(btn2,&QPushButton::clicked,[this,btn2](){
//添加参数"肉丝炒青椒"
stu->treat("肉丝炒青椒");
//使用更多方法
if(btn2->text()=="好困按钮"){
btn2->setText("学习按钮");
}else{
btn2->setText("好困按钮");
}
});
}
Widget::~Widget()
{
delete ui;
}