大家好!本篇文章将介绍Qt基础中的lambda表达式。由于博主水平有限,如有错误,欢迎大家指正!
Lambda表达式, 匿名函数对象,其可以理解为没有函数名的函数,是C++11增加的新特性。
在Qt中,Lambda表达式常和信号一起使用,非常方便,需要在项目文件中添加: CONFIG += C++11
首先看一下Lambda表达式的基本构成:
[capture](parameters) mutable ->return-type
{
statement
}
[函数对象参数] (操作符重载函数参数)mutable ->返回值{函数体}
1️⃣ 函数对象参数
[],标识一个Lambda表达式的开始,不能省略。函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。函数对象参数只能使用Lambda之前的Lambda所在范围内可见的局部变量(包括Lambda所在类的this)。
函数对象参数有以下形式:
函数对象参数 | 说明 |
---|---|
[] | 不使用任何变量 |
[=] | 以传值的方式使用所有外部变量 |
[&] | 以传引用的方式使用所有外部变量 |
[x] | 将x以传值的方式使用。使用时,函数体内不能修改传递进来的x的拷贝(默认情况下函数是const),添加mutable修饰符可对传递进来的x的拷贝进行修改 |
[x,&y] | x以传值的方式使用,y以传引用的方式使用 |
[=,&x] | x以传引用的方式使用,其余变量以传值的方式使用 |
[&,x] | x以传值的方式使用,其余变量以传引用的方式使用 |
2️⃣ 操作符重载函数参数
标识重载的()操作符的参数,没有参数时,这部分可以省略。
参数可以通过按值(如:(a,b))和按引用(如:(&a,&b))两种方式进行传递。
3️⃣ mutable
mutable声明,这部分可以省略。
4️⃣返回值
->返回值类型,标识函数返回值的类型,当返回值为void,或者函数体中只有一处return的地方(此时编译器可以自动推断出返回值类型)时,这部分可以省略。
5️⃣ {函数体}
{},标识函数的实现,这部分不能省略,但函数体可以为空。
widget.h:
#ifndef WIDGET_H
#define WIDGET_H
#include
class Widget : public QWidget{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
};
#endif // WIDGET_H
widget.cpp:
#include "widget.h"
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent){
//lambda表达式
QPushButton *btn2 = new QPushButton;
btn2->move(0,0);
btn2->setParent(this);
btn2->setText("aaa");
}
main.cpp:
#include "widget.h"
#include
int main(int argc, char *argv[]){
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
运行后效果如下:
在widget.cpp中添加lambda表达式,
[=](){
btn2->setText("bbb");
}();
刚开始学Qt,先接触到信号和槽,然后就学习Lambda表达式,其常和信号一起使用,非常方便,后续随着Qt的继续学习,还会继续记录自己觉得比较有趣的内容。
希望这篇文章能给正在学习Qt的小伙伴们一些帮助✊✊。
觉得文章写得不错的老铁们,点赞评论关注走一波!谢谢啦 !