Qt中的lambda表达式
lambda用法超详细讲解
代码语言:javascript复制 [=]{btn->setText("我的名字叫开机");}; 这是lambda表达式函数的声明,不是调用
代码语言:javascript复制 QPushButton* btn=new QPushButton("我的名字叫做关机",this);
resize(600,400);
btn->resize(200,100);
//lambda表达式在Qt中应用
[=]{btn->setText("我的名字叫开机");}();//lambda表达式的dai调用
这里为什么值传递可以修改按钮的文本属性呢? 因为这里拷贝的是地址,lambda函数体内通过值传递得到的btn指向的地址不变。
捕获列表里面只捕获了btn,没有捕获btn1,因此无法识别btn1会报错 当捕获列表填入的是=或者是&,那么默认捕获所有当前函数内的所以局部变量
Qt中最常用的是={}
不建议在捕获列表中用引用的原因:
代码语言:javascript复制 QPushButton* btn=new QPushButton("我的名字叫做关机",this);
resize(600,400);
btn->resize(100,100);
//当信号和槽连接时,控件内会进入一个锁的状态
connect(btn,&QPushButton::clicked,this,[&]{btn->setText("我他妈直接好家伙");});
当我们点击按钮后,程序就产生异常而结束
是因为当信号和槽连接后,控件内会进入一个锁的状态,在上面例子中:btn控件进入锁的状态,即只能读不能写,不能通过btn去修改控件的内容,但是如果使用值传递,拷贝地址的方式就不算通过btn修改控件内容,而算间接修改
lambda表达式中通过值传递,函数默认为const常函数不可修改参数的值,但可以通过加mutable关键字来让其可以修改
代码语言:javascript复制 QPushButton* btn=new QPushButton("我的名字叫做关机",this);
resize(600,400);
btn->resize(100,100);
int m=10;
connect(btn,&QPushButton::clicked,this,[m]()mutable{int m=20;qDebug()<<m<<endl;});
connect(btn,&QPushButton::clicked,this,[=]()mutable{qDebug()<<m<<endl;});
注意:加了mutable关键字后,前面的()不可以省略
返回值类型
代码语言:javascript复制 //->返回值类型
//捕获列表后的[]不能省
int num=[]()->int{return 1000;}();//调用()不能省
qDebug()<<num<<endl;
lambda表达式中调用槽函数
代码语言:javascript复制 QPushButton* btn=new QPushButton("我的名字叫做关机",this);
resize(600,400);
btn->resize(100,100);
//lambda表达式函数体中调用槽函数
//点击按钮,关闭窗口
connect(btn,&QPushButton::clicked,this,[=](){
this->close();
});
当connect函数第四个参数是lambda表达式时,第三个参数的this可以不写
代码语言:javascript复制 QPushButton* btn=new QPushButton("我的名字叫做关机",this);
resize(600,400);
btn->resize(100,100);
//lambda表达式函数体中调用槽函数
//点击按钮,关闭窗口
connect(btn,&QPushButton::clicked,[=](){
this->close();
});