拉姆達Lambda表達式以及Qt使用


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM