10 QT中的Lambda表达式

Lambda表达式的基本构成

[captures](params) -> return_type { body };

Lambda 主要分为五个部分,对应为

[捕获列表] (函数参数) mutable 或 exception 声明 -> 返回值类型 {函数体}

捕获列表,用来说明外部变量的访问方式,外部变量访问方式说明符可以是 = 或 & ,表示函数体中用到的、定义在外面的变量在函数体中是否允许被改变。= 表示值传递,不允许改变。& 表示引用传递,允许改变。

包括下面几种形式:

  • [ ] 表示不捕获任何变量
  • [=] 表示按值传递的方法捕获父作用域的所有变量
  • [&] 表示按引用传递的方法捕获父作用域的所有变量
  • [=, &a] 表示按值传递的方法捕获父作用域的所有变量,但按引用传递的方法捕获变量a
  • [&, a] 表示按引用传递的方法捕获父作用域的所有变量,但按值传递的方法捕获变量a

Tips: 

在低版本中需要再.pro文件中追加:CONFIG += c++11

//lambda表达式 [](){};
    QPushButton *btn2 = new QPushButton;
    btn2->move(100,0);
    btn2->setParent(this);
    btn2->setText("aaa");

    //函数体内可以使用Lambda所在作用范围内所有可见的局部变量
    [=](){
        btn2->setText("bbb");
    }();

    //mutable
    QPushButton * myBtn1 = new QPushButton(this);
    QPushButton * myBtn2 = new QPushButton(this);
    myBtn1->move(0,100);
    myBtn2->move(100,100);
    int m=10;
    //加上mutable修饰符后,可以修改按值传递进来的拷贝
    connect(myBtn1,&QPushButton::clicked,this,[m]()mutable{m=20;qDebug()<<m;});
    connect(myBtn2,&QPushButton::clicked,this,[=](){qDebug()<<m;});
    qDebug()<<m;
    
    //->返回值类型
    int num = []()->int{return 100;}();
    qDebug()<<"num="<<num;
    
    //[](){}推荐使用
    QPushButton * btn3 = new QPushButton;
    btn3->setParent(this);
    btn3->move(200,200);
    btn3->setText("aaa");

    //槽函数是lambda表达式,则接受者this可以省略
    connect(btn3,&QPushButton::clicked,[=](){
        btn3->setText("ccc");
        this->st->treat("鱼香肉丝"); //解决clicked不能连接有参槽函数的问题
        this->close();
    });

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

让我看看谁在学习

你的鼓励是我创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值