0 背景

qt中经常会使用信号来调用槽函数,但是有时候槽函数特别短,有诸多不便,因此找寻一种解决方法,发现了lambda表达式。

1 介绍

结构

[捕获的列表](形参列表)mutable{函数体}

1.1 捕获的列表

捕获形式	说明
[]	不捕获任何外部变量
[变量名,]	默认以值得形式捕获指定的多个外部变量(用逗号分隔),如果引用捕获,需要显示声明(使用&说明符)
[this]	以值的形式捕获this指针
[=]	以值的形式捕获所有外部变量
[&]	以引用形式捕获所有外部变量
[=, &x]	变量x以引用形式捕获,其余变量以传值形式捕获
[&, x]	变量x以值的形式捕获,其余变量以引用形式捕获

1.2 形参列表

如果是按值[=]传递时,不允许程序员修改捕获的变量,使用mutable可以打破限制。

测试代码:

    int a1 = 10;
 //会报错:error: cannot assign to a variable captured by copy in a non-mutable lambda
     //[=](){ a1 = 20;};
     [=]()mutable{ a1 = 20;};
    qDebug()<<"A:"<<a1;

在这里插入图片描述

2 使用

2.1 特别短小的槽函数(发挥匿名函数的“一次性函数作用”)

.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;

private: 
    int a = 0;//声明变量
};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include "ui_widget.h"

#include<QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    
    //改变变量
    connect(ui->pushButton, &QPushButton::clicked,  [=](){
       a = 10; 
    });
}

Widget::~Widget()
{
    delete ui;
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐