Qt基础 Lambda表达式

根据B站《最新QT从入门到实战完整版|传智教育》学习的,BV号:BV1g4411H78N

Lambda表达式

[ ]标识符,匿名函数,[ ]( ){ }

1.= 值传递

2.& 引用传递

3.( )参数

4.{ }实现体

5.mutable修饰值传递变量,可以修改拷贝出的数据,改变不了本体

6.返回值 [ ]( )->返回值类型{ }

7.调用函数 [ ]( ){ }( );

Lambda表达式最常用  [=]( ){ }

案例

widget.cpp:其余代码看前面的文章!

#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>

//Teacher类  老师类
//Student类  学生类
//下课后,老师会触发一个信号“饿了”,学生响应信号然后“请客吃饭”

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //创建一个老师对象
    this->t = new Teacher(this);

    //创建一个学生对象
    this->st = new Student(this);

        //连接不带参数的信号和槽

//    //老师饿了学生请客的连接
//    connect(t,&Teacher::hungry,st,&Student::treat);

//    //调用下课函数
//    ClassIsOver();

        //连接带参数的信号和槽
    //指针 -> 地址
    //函数指针 -> 函数地址
    void(Teacher:: * teacherSignal)(QString) = &Teacher::hungry;        //定义函数指针
    void(Student:: * studentSlot)(QString) = &Student::treat;
    connect(t,teacherSignal,st,studentSlot);
    //ClassIsOver();

    //点击下课按钮再触发下课
    QPushButton * btn = new QPushButton("下课",this);
    //重置窗口大小
    this->resize(600,400);

    //点击按钮,触发下课
    //connect(btn,&QPushButton::clicked,this,&Widget::ClassIsOver);

    //无参信号和槽连接
    void(Teacher:: * teacherSignal2)(void) = &Teacher::hungry;
    void(Student:: * studentSlot2)(void) = &Student::treat;
    connect(t,teacherSignal2,st,studentSlot2);

    //信号连接信号
    connect(btn,&QPushButton::clicked,t,teacherSignal2);

    //断开信号
    //disconnect(t,teacherSignal2,st,studentSlot2);

    //拓展
    //1.信号是可以连接信号的
    //2.一个信号可以连接多个槽函数
    //3.多个信号可以连接同一个槽函数
    //4.信号和槽的参数类型必须一一对应
    //5.信号的参数个数可以多于槽函数的参数个数

        //Qt4版本以前的信号和槽的连接方式
    //利用Qt4信号槽,连接无参版本
    //Qt4版本 底层SIGNAL("hungry")  SLOT("treat")
    //connect(t,SIGNAL(hungry()),st,SLOT(treat()));
    //Qt4版本优点:参数直观  缺点:类型不做检测

        //lambda表达式
    //中括号中的 = 为值传递,包含局部变量中的所有变量,包括所在类的this
    //中括号中的 & 为引用传递
//    [=](){
//        btn->setText("aaaa");
//    }();
    //只包含stn(空括号中的变量)
//    QPushButton * btn2 = new QPushButton;
//    [stn](){
//        btn->setText("aaa");
//        btn2->setText("bbbb");      //btn2看不到
//    }

    //mutable关键字,用于修饰值传递的变量,修改的是拷贝,而不是本体

//    QPushButton * myBtn = new QPushButton(this);
//    QPushButton * myBtn2 = new QPushButton(this);
//    myBtn2->move(100,100);
//    int m = 10;

//    connect(myBtn,&QPushButton::clicked,this,[m]()mutable{m = 100 + 10; qDebug() << m;});

//    connect(myBtn2,&QPushButton::clicked,this,[=](){ qDebug() << m;});

//    qDebug() << m;

//    int ret = []()->int{return 1000;}();
//    qDebug() << "ret = " << ret;

    //利用lambda表达式,实现点击窗口关闭窗口
    QPushButton * btn2 = new QPushButton;
    btn2->move(100,0);
    btn2->setText("关闭");
    btn2->setParent(this);
    connect(btn2,&QPushButton::clicked,this,[=](){      //第三个参数是this的话可以省略掉
//        this->close();
//        emit t->hungry("宫保鸡丁");

        btn2->setText("aaa");
    });
    //lambda表达式最常用[=](){}

}

void Widget::ClassIsOver()
{
    //下课函数,调用后触发老师饿了的信号
    //emit t->hungry();
    emit t->hungry("宫保鸡丁");
}
Widget::~Widget()
{
    delete ui;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值