0、概述
格式:[capture](parameters) mutable ->return-type{statement}
1、简单格式
auto f = [] {
std::cout << "this is lambda" <<std::endl;
}
f();
2、直接调用
[] {
std::cout << "this is lambda" <<std::endl;
} ();
3、带参数
auto f = [] (const std::string& s){
std::cout << "this is lambda :" << s <<std::endl;
}
f("Im lambda.");
4、带返回值
[] {
return 100;//未指定返回类型,这里默认为100
}
f();
5、指定返回类型
auto f = [] () -> double {
return 100;
}
f();
6、访问外部作用域
int x=100;
int y=200;
auto f = [x,&y] {
++x;//x是值传递,不能这样,编译不过
++y;//y是引用传递,可以这样
}
x++,y++;
f();
只有引用传递才能在lambda表达式中修改值,比如最后y=202;如果是值传递,那么表达式之中的x的初始值就是表达式定义时的值=100
7、可以改变值传递的值
int x=100;
auto f = [x]() mutable {
++x;//x是值传递,但是可以这样写
}
f();
8、QTimer使用
QTimer::singleShot(VALUE_300,NULL,[=]()
{
updateSlot(SQL_CODE_12);
});
[]代表这是拉姆达函数,=代表是值传递,()代表入参这里没有,{}是函数体
9、按钮使用【有信号发送者也有信号接收者】
QDialog* log = new QDialog(this);
QPushButton* okBtn = new QPushButton(log);
QHBoxLayout* hLayout = new QHBoxLayout();
hLayout->addWidget(okBtn);
log->setLayout(hLayout);
QObject::connect(okBtn, &QPushButton::clicked,log,[=]()
{
log->done(1);
});
if(1==log->exec())
{
//...
}
注意核心就是不要写SIGNAL和SLOT,用对象类名表示
1).[var]表示值传递方式捕捉变量var;
2).[=]表示值传递方式捕捉所有父作用域的变量(包括this);
3).[&var]表示引用传递捕捉变量var;
4).[&]表示引用传递方式捕捉所有父作用域的变量(包括this);
5).[this]表示值传递方式捕捉当前的this指针。
10、QComboBox使用【有信号发送没有接收】
connect(box,&QComboBox::currentTextChanged,[](QString){});
注意这个信号必须是非重载的,否则会报错
10、Qt connect连接信号如果时重载需要转化
connect(box,static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),[](int){});
参考:https://www.cnblogs.com/rainbow70626/p/10328143.html