QT中信号与槽允许使用任意函数作为槽函数,但如果想要更好地执行异步代码,连函数都不想定义,Connect关联时直接指定信号发出时执行的代码,那么就需要用到Lambda表达式,示例如下:
connect(dlg,&StringDialog::stringChanged,
[=](QString str)
{
if(str == "qt")
{
ui->stringLabel->settext("hello qt");
}
else
{
ui->stringLabel->settext("error");
}
});
1.直接在Connect语句中添加了信号发射后要执行的代码,使用参数值区别显示不同的字符。这种写法就是所谓的Lambda表达式。
2.Lambda表达式是C++11新增加的特性,简单来说Lambda表达式就是匿名函数。
3.在C++11中,它以一对方括号开始,这对方括号被称为Lambda表达式的引入符,引入符后面可以添加Lambda表达式的返回值类型,之后是参数列表,最后是Lambda表达式的函数体
4.不同的Lambda表达式引入符有着不同的含义,引入符描述函数如何“获得”外部变量。这一过程被称为“捕获”。所谓的外部变量就是指函数体以外的变量,这些变量需要在引入符可见的作用域有定义
Lambda表达式引入符
| 引入符 | 说明 |
|---|---|
| [ ] | 不捕获任何外部变量 |
| [=] | 以传值的方式捕获外部所有的外部变量 |
| [&] | 以引用的方式捕获外部所有变量 |
| [x,&y] | x传值的方式,y以传引用的方式捕获 |
| [=,&x] | x以传引用的方式,其余外部变量则以传值的方式捕获 |
| [&,x] | x以传值的方式捕获,其余外部变量则以传引用的方式捕获 |
例如一个Lambda表达式需要两个参数,以传值的方式捕获a和以传引用的方式捕获的str,其返回值是QString类型,那么这个Lambda表达式应该写成:
connect(dlg,&StringDialog::stringChanged,[a,&str]->QString
{
});
声明:
本文采用
BY-NC-SA
协议进行授权,如无注明均为原创,转载请注明转自
我的知识库
本文地址: QT之Lambda表达式用法
本文地址: QT之Lambda表达式用法