Lambda表达式
Lambda表达式用于定义并创建匿名的函数对象
capturemutable->return-type
{
statement
}
[]标识符 表示一个Lambda的开始 必须存在 不能省略
()参数
{}实现体
在Lambda表达式中
= 表示值传递 可以让Lambda表达式在作用范围内所有可见的局部变量(包括Lambda所在类的this)
例如
= 方式 值传递
[=](){ btn->setText("ddd"); }()//如果不写=就会报错 因为程序并不知道btn是什么
a 方式 就是直接指定某个值传进来
[btn](){ btn->setText("ddd"); }()//如果只写btn则只有btn在大括号里面才能从外面传递进来 如果在大括号里面调用其他的 则会出问题比如btn2
& 方式表示引用传递方式
[&](){ btn->setText("ddd"); }()
&a 方式 指定特定的值
[&btn](){ btn->setText("ddd"); }()
a,&b方式
[btn,&btn2](){ btn->setText("ddd"); btn2->setText(""zz);}()
=,&a,&b方式 除了a,b按引用方式 其他值都按值传递方式
[= &btn,&btn2](){ btn->setText("ddd"); btn2->setText(""zz);}()
&,=a,=b方式 除了a,b按引用方式 其他值都按值传递方式
[& =btn,=btn2](){ btn->setText("ddd"); btn2->setText(""zz);}()
mutable方式 更改值传递进来的拷贝值 注意不会改变值本体 只是改变拷贝值
connect(btn,&QPushButton::clicked,this,[m]()mutable(m = 100+10;qDebuf()<<m;))
->int方式 设置函数返回值
int ret = {}()->int{return 1000;}();//设置返回值为int类型
运用
本来在上一章中 如果要实现鼠标点击的有参版本的是
connect(btn,&QPushButton::clicked,this,&Widget::Over);
void Widget::Over()
{
emit teacher->hungry("宫保鸡丁");
}
所以如果调用Lambda表达式就可以实现
connect(btn,&QPushButton::clicked,this,[=](){
emit teacher->hungry("宫保鸡丁");
//还可以加一些别的操作 例如
//this->close();
});
如果触发了点击信号 则调用本窗口的匿名函数对象 该函数直接触发