QT学习日记6——Lambda表达式

QT学习日记6——Lambda表达式,第1张

学习视频链接

最新QT从入门到实战完整版|传智教育_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1g4411H78N?p=14

一、Lambda表达式简介 1.1 简介

C++11 中的 Lambda 表达式用于定义并创建置名的函效对象,以简化编程工作

1.2 QT中使用的注意事项

需要添加这一句话,表示使用 C++11

二、语法 2.1 函数声明

 

2.2 []中的参数

空。没有使用任何函数对象参数。

=。函数体内可以使用Lambda所在作用范圈内所有可见的局部交量 (包括Lambda所在类的 this),并且是值传递方式 (相当于编译器自动为我们按值传递了所有局部变量)。

&。函数体内可以使用 Lambda 所在作用范图内所有可见的局部交量 (包括 Lambda 所在类的 this),并且是引用传递方式(相当于编译器自动为我们按引用传递了所有局部交量)

this。函数体内可以使用 Lambda 所在类中的成员交量

a。将 a 按值进行传递。按值进行传递时,函数体内不能修改传递进来的 a 的拷贝,因为默认情况下函数是 const 的。要修改传递进来的 a 的拷贝,可以添加 mutable 修饰符

&a。 将 a 按引用进行传递.

a,&b。将 a 按值进行传递,b 按引用进行传递

=,&a,&b。除 a 和 b 按引用进行传递外,其他参数都按值进行传送

&,a,b。除 a 和 b 按值进行传递外,其他参数都按引用进行传递

2.3 函数调用

 

2.4 测试其他参数

下图中,只有 btn 能传入进 lambda 表达式

 

三、与 connect 结合 3.1 mutable

mutable 声明,这部分可以省略。按值传递函数对象参数时,加上 mutable 修饰符后,可以修改按值传递进未的拷贝 (注意是能修改拷贝,而不是值本身)

3.2 代码

 

#include "widget.h"
#include 
#include 


Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    QPushButton *btn = new QPushButton("上课", this);

    // 重置窗口大小
    this->resize(600, 400);

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

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

void Widget::ClassIsOn()
{
    emit zt->teach("数学");
}

Widget::~Widget()
{
    qDebug() << "Widget的析构调用";
}

 

四、函数的返回值

int ret = [] ()->int{return 1000;}();

五、利用 Lambda 表达式实现按钮关闭窗口 5.1 代码

 

#include "widget.h"
#include 
#include 


Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    // 创建一个老师的对象
    this->zt = new Teacher(this);

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

    void(Teacher:: *teacherSignal)(QString) = &Teacher::teach;
    void(Student:: *studentSlot)(QString) = &Student::learn;
    connect(zt, teacherSignal, st, studentSlot);
    ClassIsOn();

    // 点击一个 上课按钮,再触发上课
    QPushButton *btn = new QPushButton("关闭", this);

    // 重置窗口大小
    this->resize(600, 400);

    //利用lambda表达式实现点击按钮关闭窗口
    btn->move (100,0) ;
    connect(btn, &QPushButton::clicked, this, [=] () {
        this->close() ;
        emit zt->teach("语文");
    });
}

void Widget::ClassIsOn()
{
    emit zt->teach("数学");
}

Widget::~Widget()
{
    qDebug() << "Widget的析构调用";
}

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1295408.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存