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()<返回值类型
    int num = []()->int{return 100;}();
    qDebug()<<"num="<setParent(this);
    btn3->move(200,200);
    btn3->setText("aaa");

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

 

你可能感兴趣的:(QT,qt)