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

{

});