学习视频链接
最新QT从入门到实战完整版|传智教育_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1g4411H78N?p=14
一、Lambda表达式简介 1.1 简介C++11 中的 Lambda 表达式用于定义并创建置名的函效对象,以简化编程工作
1.2 QT中使用的注意事项需要添加这一句话,表示使用 C++11
二、语法 2.1 函数声明2.2 []中的参数
空。没有使用任何函数对象参数。
=。函数体内可以使用Lambda所在作用范圈内所有可见的局部交量 (包括Lambda所在类的 this),并且是值传递方式 (相当于编译器自动为我们按值传递了所有局部变量)。
&。函数体内可以使用 Lambda 所在作用范图内所有可见的局部交量 (包括 Lambda 所在类的 this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部交量)
this。函数体内可以使用 Lambda 所在类中的成员交量
a。将 a 按值进行传递。按值进行传递时,函数体内不能修改传递进来的 a 的拷贝,因为默认情况下函数是 const 的。要修改传递进来的 a 的拷贝,可以添加 mutable 修饰符
&a。 将 a 按引用进行传递.
a,&b。将 a 按值进行传递,b 按引用进行传递
=,&a,&b。除 a 和 b 按引用进行传递外,其他参数都按值进行传送
&,a,b。除 a 和 b 按值进行传递外,其他参数都按引用进行传递
2.3 函数调用2.4 测试其他参数
下图中,只有 btn 能传入进 lambda 表达式
三、与 connect 结合 3.1 mutable
mutable 声明,这部分可以省略。按值传递函数对象参数时,加上 mutable 修饰符后,可以修改按值传递进未的拷贝 (注意是能修改拷贝,而不是值本身)
3.2 代码
#include "widget.h"
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
QPushButton *btn = new QPushButton("上课", this);
// 重置窗口大小
this->resize(600, 400);
QPushButton *btn2 = new QPushButton("第二个按钮", this);
btn2->move(100, 100) ;
int m = 10;
connect(btn, &QPushButton::clicked, this, [m] ()mutable { m = 100 + 10; qDebug() << m; });
connect(btn2, &QPushButton::clicked, this, [=] () { qDebug() << m; });
}
void Widget::ClassIsOn()
{
emit zt->teach("数学");
}
Widget::~Widget()
{
qDebug() << "Widget的析构调用";
}
四、函数的返回值
int ret = [] ()->int{return 1000;}();
五、利用 Lambda 表达式实现按钮关闭窗口 5.1 代码
#include "widget.h"
#include
#include
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
// 创建一个老师的对象
this->zt = new Teacher(this);
// 创建一个学生的对象
this->st = new Student(this);
void(Teacher:: *teacherSignal)(QString) = &Teacher::teach;
void(Student:: *studentSlot)(QString) = &Student::learn;
connect(zt, teacherSignal, st, studentSlot);
ClassIsOn();
// 点击一个 上课按钮,再触发上课
QPushButton *btn = new QPushButton("关闭", this);
// 重置窗口大小
this->resize(600, 400);
//利用lambda表达式实现点击按钮关闭窗口
btn->move (100,0) ;
connect(btn, &QPushButton::clicked, this, [=] () {
this->close() ;
emit zt->teach("语文");
});
}
void Widget::ClassIsOn()
{
emit zt->teach("数学");
}
Widget::~Widget()
{
qDebug() << "Widget的析构调用";
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)