【QT】06 Lambda表达式

  代码资源:https://download.csdn.net/download/qq_36926037/85019729

6.1 基础概念

  C++11中,Lambda表达式用于定义并创建匿名函数对象,以简化编程工作。Lambda表达式的基本构成:
  [ capture ] ( parameters ) mutable ->return-type { statement };
  [ 函数对象参数 ] ( 操作符重载函数参数) mutable ->返回值 { 函数体 };
  参数:
   (1)函数对象参数[ ]: []标识一个lambda函数的开始,不能省略,函数对象参数是传递给编译器自动生成的函数对象类的构造函数的,函数对象参数只能使用那些定义Lambda为止时Lambda所在作用范围内可见的局部变量(包括Lambda所在类的this),函数对象参数有以下几个形式:
    [ ]:没有使用任何函数对象参数
    [=]:函数体内可以使用函数所在作用域范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)推荐值传递方式
在这里插入图片描述

    [&]: 函数体内可以使用函数所在作用域范围内所有可见的局部变量(包括Lambda所在类的this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部变量)推荐值传递
    [this]:函数体内,可以使用函数所在类中的成员变量
    [a]:将a进行按值传递,并且按值传递时,函数体内不能修改传递进来的a的拷贝,因为默认情况下函数是const的,要修改传递进来的a的拷贝,可以添加mutable修饰符
    [&a]:将a进行按引用传递
    [=,&a]:除了a按引用,其他都是按值
    
  (2) 操作符重载函数参数(): 标识重载的()操作符的参数,没有参数时,这部分可以省略,参数可以通过按值和按引用两种方式进行传递
   (3)mutible可修改标识符: mutible声明,按值传递函数对象时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是修改拷贝,不是值本身)
在这里插入图片描述
  (4)返回值类型(函数返回值): 当返回值为void类型时,或者函数体中只有一处return的地方时,这部分可以省略
在这里插入图片描述
  (5) 函数体 {}: 这部分不可以省略,但是可以为空

6.2 Lambda函数使用案例

  需求:利用Lambda函数表达式,实现点击按钮关闭窗口
  (1)创建项目03qtproject,该项目包含一个窗口QWidget类,详细创建步骤参考博客:https://blog.csdn.net/qq_36926037/article/details/123720720 项目结构如图所示:
在这里插入图片描述
  (2)在窗口的原文件的构造函数中。使用lambda表达式,实现目标
在这里插入图片描述

#include "widget.h"
#include <QPushButton>
#include <QDebug>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QPushButton *btn1=new QPushButton;
    btn1->setParent(this);
    btn1->setText("第一个按钮");

    QPushButton *btn2=new QPushButton;
    btn2->setParent(this);
    btn2->setText("第二个按钮");
    btn2->move(200,200);

    //lambda函数声明
//    [=](){
//        btn1->setText("改名第一个按钮");
//        btn2->setText("改名第二个按钮");

//    };

    [=](){
        btn1->setText("改名第一个按钮");
        btn2->setText("改名第二个按钮");
    }();

    //mutable关键字
    QPushButton *btn3=new QPushButton;
    btn3->setParent(this);
    btn3->setText("按钮1");
    btn3->move(300,0);

    QPushButton *btn4=new QPushButton;
    btn4->setParent(this);
    btn4->setText("按钮2");
    btn4->move(300,100);
    int a=10;
    connect(btn3,&QPushButton::clicked,this,
            [a]()mutable{a=a+100;qDebug()<<a;});
    connect(btn4,&QPushButton::clicked,this,
            [=](){qDebug()<<a;});
    qDebug()<<a;

    //—>返回值类型
    int b=[]()->int {return 100;}();
    qDebug()<<b;

    //利用lambda函数实现点击按钮关闭窗口
    QPushButton *btn5=new QPushButton;
    btn5->setParent(this);
    btn5->setText("lambda案例");
    btn5->move(500,200);
    connect(btn5,&QPushButton::clicked,this,[=]()
    {
        this->close();
        //关闭窗口的代码,也可以填入槽函数,或者信号等。。。
    });
}

Widget::~Widget()
{
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值