Qt中的lambda表达式

2021-11-15 10:18:43 浏览数 (1)

Qt中的lambda表达式

lambda用法超详细讲解

代码语言:javascript复制
   [=]{btn->setText("我的名字叫开机");}; 这是lambda表达式函数的声明,不是调用
代码语言:javascript复制
    QPushButton* btn=new QPushButton("我的名字叫做关机",this);
    resize(600,400);
    btn->resize(200,100);
    //lambda表达式在Qt中应用
   [=]{btn->setText("我的名字叫开机");}();//lambda表达式的dai调用

这里为什么值传递可以修改按钮的文本属性呢? 因为这里拷贝的是地址,lambda函数体内通过值传递得到的btn指向的地址不变。

捕获列表里面只捕获了btn,没有捕获btn1,因此无法识别btn1会报错 当捕获列表填入的是=或者是&,那么默认捕获所有当前函数内的所以局部变量

Qt中最常用的是={}

不建议在捕获列表中用引用的原因:

代码语言:javascript复制
   QPushButton* btn=new QPushButton("我的名字叫做关机",this);
    resize(600,400);
    btn->resize(100,100);
     //当信号和槽连接时,控件内会进入一个锁的状态
    connect(btn,&QPushButton::clicked,this,[&]{btn->setText("我他妈直接好家伙");});

当我们点击按钮后,程序就产生异常而结束

是因为当信号和槽连接后,控件内会进入一个锁的状态,在上面例子中:btn控件进入锁的状态,即只能读不能写,不能通过btn去修改控件的内容,但是如果使用值传递,拷贝地址的方式就不算通过btn修改控件内容,而算间接修改

lambda表达式中通过值传递,函数默认为const常函数不可修改参数的值,但可以通过加mutable关键字来让其可以修改

代码语言:javascript复制
    QPushButton* btn=new QPushButton("我的名字叫做关机",this);
    resize(600,400);
    btn->resize(100,100);
    int m=10;
    connect(btn,&QPushButton::clicked,this,[m]()mutable{int m=20;qDebug()<<m<<endl;});
    connect(btn,&QPushButton::clicked,this,[=]()mutable{qDebug()<<m<<endl;});

注意:加了mutable关键字后,前面的()不可以省略

返回值类型

代码语言:javascript复制
    //->返回值类型
    //捕获列表后的[]不能省
    int num=[]()->int{return 1000;}();//调用()不能省
    qDebug()<<num<<endl;

lambda表达式中调用槽函数

代码语言:javascript复制
    QPushButton* btn=new QPushButton("我的名字叫做关机",this);
    resize(600,400);
    btn->resize(100,100);
    //lambda表达式函数体中调用槽函数
    //点击按钮,关闭窗口
    connect(btn,&QPushButton::clicked,this,[=](){
        this->close();
    });

当connect函数第四个参数是lambda表达式时,第三个参数的this可以不写

代码语言:javascript复制
    QPushButton* btn=new QPushButton("我的名字叫做关机",this);
    resize(600,400);
    btn->resize(100,100);
    //lambda表达式函数体中调用槽函数
    //点击按钮,关闭窗口
    connect(btn,&QPushButton::clicked,[=](){
        this->close();
    });

0 人点赞