QT-Lanbda表达式
Lanbda表达式
C++11中的Lambda表达式用于定义匿名的函数对象,以简化编程工作。
首先看一下Lambda表达式的基本构成
[capture](parameters)opt -> retType {
......
}
[局部变量捕获列表](函数参数)函数额外属性设置opt 函数返回值->retype{函数主体}
1.1 局部变量引入方式 [ ]
[ ] : 标识一个Lambda的开始。不可省略。
[ ] | 局部变量捕获列表 |
---|---|
[ ] | lambda表达式不能访问外部函数体的任何局部变量 |
[a] | 在函数体内部使用值传递的方式访问a变量 |
[&b] | 在函数体内部使用引用传递的方式访问b变量 |
[=] | 函数外的所有局部变量都通过值传递的方式使用, 函数体内使用的是副本 |
[&] | 引用的方式使用lambda表达式外部的所有变量 |
[=, &foo] | foo使用引用方式, 其余是值传递的方式 |
[&, foo] | foo使用值传递方式,其余引用传递 |
[this] | 在函数内部可以使用类的成员函数和成员变量,=和&形式也都会默认引入 |
由于引用方式捕获对象会有局部变量释放了而lambda函数还没有被调用的情况。如果执行lambda函数那么引用传递方式捕获进来的局部变量的值不可预知。所以在无特殊情况下建议使用的形式[=](){}
。
1.2 函数参数()
(params)表示lambda函数对象接收的参数,类似于函数定义中的小括号表示函数接收的参数类型和个数。参数可以通过按值(如:(int a,int b))和按引用(如:(int &a,int &b))两种方式进行传递。
函数参数部分可以省略,省略后相当于无参的函数。
1.3 选项Opt
Opt 部分是可选项,最常用的是mutable声明
,这部分可以省略。
外部函数局部变量通过值传递引进来时,其默认是const,所以不能修改这个局部变量的拷贝,加上mutable就可以修改。
QPushButton * myBtn = new QPushButton(this);
QPushButton * myBtn2 = new QPushButton(this);
int m = 10;
myBtn->move(300, 100);
myBtn2->move(500, 100);
// 添加mutalbe声明后,可以修改局部变量m的拷贝
connect(myBtn, &QPushButton::clicked, this, [m]()mutable{m = 20; qDebug() << m;});
connect(myBtn2, &QPushButton::clicked, this, [=](){qDebug()<< m;});
1.4 函数返回值 ->
->retType
,标识lambda函数返回值的类型。这部分可以省略,但是省略并不代表函数没有返回值,编译器会自动根据函数体内的return语句判断返回值类型,但是如果有多条return语句,而且返回的类型都不一样,编译会报错。
// 返回值类型
int num = [=]()->int{
return 1000;
}();
qDebug() << num;
1.5 函数主体
{},标识函数的实现,不能省略,但函数体可以为空。
1.6 槽函数使用Lambda表达式
以QPushButton点击事件为例:
connect(btn, &QPushButton::clicked, [=](){qDebug() << "Clicked";});
这里可以看出使用Lambda表达式作为槽的时候可以不需要填入信号的接收者。
当点击按钮的时候,clicked信号被触发,lambda表达式也会直接运行。当然lambda表达式还可以指定函数参数,这样也就能够接收到信号函数传递过来的参数了。
由于lambda表达式比我们自己自定义槽函数要方便而且灵活得多,所以在实现槽函数的时候优先考虑使用Lambda表达式。一般我们的使用习惯也是lambda表达式外部函数的局部变量全部通过值传递捕获进来,也就是: [=](){ }
的形式。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)