Qt——04Lambda表达式和信号

lambda表达式

直接看一个简单的例子:

1
2
3
4
5
//定义一个简单的lambda表达式
auto lambda_test = []{cout<<"hello world"<<endl;};
//调用
lambda_test();
//这样就会输出一个hello world。

lambda是C++11中引入的一个新的特性。可以用来编写内嵌的匿名函数来替代独立函数或者函数的对象。还能够使代码的可读性得到明显的上升。我所理解的lambda就是——将一些复杂的代码简化,提升编码的效率。

上边的例子是一个最简单的没有参数的lambda表达式。表达式一般从[]开始在{}结束。花括号里边就像定义函数那样。

如果需要参数,那么就要像函数那样,放在圆括号里面,如果有返回值,返回类型要放在->后面,即拖尾返回类型,当然你也可以忽略返回类型,lambda会帮你自动推断出返回类型:

1
2
3
4
5
6
7
//说明返回值类型
auto add = [](int a,int b) -> int {return a + b;};
//自动推断返回值类型
auto multiply = [](int a,int b){return a * b;};

int sum = add(2,5); //输出7
int product = mulitiply(2,5); //输出10

关于Lambda的更多特性可以参见简书的这篇文章。上述的总结也都是我在这篇文章中的摘抄。

Qt中的Lambda

注:因为是新增加的特性,所以我们需要在项目文件中加上CONFIG += C==11才能保证项目的正常编译。

Lambda实际上是一个匿名函数,简单看一下在Qt中的实际运用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
QpushButton *b = new QPushButton(this);
int a,b;
a=1;
connect(b,&QPushButton::clicked,
// = :把外部所有的局部变量,类中所有成员函数以值传递的方式传进来
// 值传递的意思就是不能再在Lambda中修改了。除非[=]()mutable
// this:类中的所有成员以值传递的形式传进来
// &:引用符号,把外部所有的局部变量引入进来
[=](bool isCheck)
{
b->setText("button changed");
qDebug()<<isCheck;
qDebug()<<"1111";
}
);

[]代表你命函数的开始,作用是可以把外部的参数传进来虽然看起来像函数传参,但是实际上不是函数传参,()中是参数,{}中是函数体。
这样写的效果就是:每按下按键b,程序就会输出一个字串“111”。

lambda感觉还不是很懂。但是老师就讲到这里了。就这样吧。以后卡住了再上网查资料。