拉姆达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