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