简述

lambda   (来姆达啊) 很标准哈哈
英 /ˈlæmdə/  美 /ˈlæmdə/
百度百科

“Lambda 表达式”(lambda
expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambdaabstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

个人理解

匿名在于它不属于哪个类的方法,可以直接在函数内部进行实现。

你需要一个函数,但是又不想声明和命名函数,就可以使用匿名函数。

很意外的发现了这种表达式,还是在Java的Up主公众号上看到的。
误以为没C++什么事,后来发现在Java、Python和C++中都可以使用这种特性,C++11有支持。

Qt5.4版本以后均可以直接使用。之前的版本需要在pro文件中添加

CONFIG += c++11

这是由c++编译器 提供支持的

代码示例

先好奇 再讲语法
一个简单的按钮文本反转实现 点击“打开” 再点“关闭”

 //WRONG connect(m_pBtnTest,SIGNAL(clicked()),[=](bool isCheck){connect(m_pBtnTest,&QPushButton::clicked,[=](bool isCheck){if(isCheck)m_pBtnTest->setText("打开");elsem_pBtnTest->setText("关闭");});

省去了声明槽函数,定义槽函数的麻烦,是不是爽多了。很多时候根本就不想去声明槽函数,跳来跳去,就只想写那么一两句。早就想干掉这种麻烦,如今解决了。

lambda语法

以下只说常用的语法,3分钟学会 具体语法大家可以百度深入了解

一个完整的lambda表达式有以下5个部分 值传递方式、参数声明、修饰、返回类型、函数实现

[=] (QString strId) mutable ->int {qDebug()<<strId;
}
  1. [] //不可省略 可为空
    函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。
    函数对象参数只能使用那些到定义 Lambda 为止时 Lambda 所在作用范围内可见的局部变量(包括 Lambda 所在类的 this)。函数对象参数有以下形式:
  • = 值传递
  • & 引用传递
  • this 传递this指针
  • m_strId 值方式传递变量 函数体内不可修改此变量的值 因为默认的是const 除非添加了mutable修饰
//可多种传递方式
[=,&m_strId,&m_strName] //m_strId m_strName 两个变量是引用方式传递 其他变量值传递
[&,=a]  //除a 意外的变量都是引用方式传递
  1. () //可省略不写
    函数参数

  2. mutable/exception //可省略不写
    声明: 按值传递函数对象参数时,加上 mutable 修饰符后,可以修改传递进来的拷贝(注意是能修改拷贝,而不是值本身)。exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)。

  3. -> //可省略不写
    返回值类型 标识函数返回值的类型,当返回值为 void,或者函数体中只有一处 return 的地方(此时编译器可以自动推断出返回值类型)

  4. {} //不可省略 可为空
    函数的具体实现

完整代码示例

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QPushButton>class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void initUI();
signals:void sigClick(QString strText);
private:QPushButton *m_pBtnTest;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QDebug>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{initUI();
}void MainWindow::initUI()
{m_pBtnTest = new QPushButton(this);m_pBtnTest->move(20,20);m_pBtnTest->setText("打开");m_pBtnTest->setCheckable(true);/*用法一*/connect(m_pBtnTest,&QPushButton::clicked,[=](bool isCheck){if(isCheck)m_pBtnTest->setText("打开");elsem_pBtnTest->setText("关闭");emit sigClick(m_pBtnTest->text());});/*用法2*/auto irq = [=](QString strBtnText){qDebug()<<strBtnText;};connect(this,&MainWindow::sigClick,irq);
}

Qt lambda 简化你的代码 connect 写法示例 省略槽函数定义相关推荐

  1. Qt使用JNI调用Java代码—————附带完整示例

    文章目录 0 背景 1 调用准备 2 调用 2.1 调用方法 2.2 方法签名 2.3 调用示例 2.4 注意事项 3 完整示例代码 3.1 部分代码 3.2 附赠示例 0 背景 在开发Android ...

  2. Qt中槽函数触发两次的两种场景分析

    在Qt开发中,有两种情况能够触发槽函数被触发两次,第一种情况是必现的,属于错误的写法,是指信号和槽关联两次:第二种情况是偶然出现的,是指对信号没有正确理解导致的. 1.信号与槽关联两次     通常这 ...

  3. qt学习之路3 ---信号与槽机制

    信号和槽机制 1.概述 Qt采用了一种全新的对象和方法的关联与通信机制,称为信号和槽机制.信号和槽机制是独立于标准C++编译器的,在编译之前需要经过Qt的专门预处理工具MOC(Meta Object ...

  4. Qt信号槽之槽函数中获取发送信号对象——sender()

    QObject::sender() 我们如何在槽函数中获取到信号的发送对象呢,使用sender()方法即可获取.但是使用此方法我们需要注意几点: QObject *QObject::sender() ...

  5. Qt信号发送过快,槽函数处理不过来解决方法

    问题: 跨线程使用信号与槽连接,信号的发送时间间隔小于槽函数处理的时间间隔,造成的问题. 子线程下的槽函数,用sleep来模拟槽函数的耗时操作: void MyThread::myTimeout() ...

  6. Qt信号和槽函数连接不成功原因

    Qt信号和槽连接失败原因主要有以下几点: 1.槽函数并没有声明在类的public slots(或private slots或protected slots)里,因此,所想要成为槽函数的那个函数只是普普 ...

  7. Qt信号槽中槽函数为虚函数的一些感想

    有时候,在写connect的时候会去犹豫一个问题----我的槽函数到底需不需要为虚函数.这个问题在我每次写connect的时候我都会反问自己,因为确实,如果你不去深究里面的moc,你发现不了太多问题. ...

  8. Qt信号槽中connect五个重载函数详细说明,连接类型Qt::DirectConnection,Qt::QueuedConnection,附详细代码

    想说在前面的两句话. 信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的程序设计能力. 信号与槽是Qt学习的重点,但不是难点. 本篇介绍Qt ...

  9. 【QT】无需写connect代码关联信号和槽函数

    对于一些简单的事件判别,如点击按钮. 无需写代码关联信号和槽函数. connect(ui->Btnshowhello,SIGNAL(clicked(bool)),this,SLOT(Btnsho ...

  10. Lambda表达式简化Runnable接口的匿名内部类写法。

    Lambda表达式简化Runnable接口的匿名内部类写法. 点进去Lambda接口中去发现,只有一个抽象方法, 并且有@FunctionalInterface(函数式接口的注解). 有了这个注解的接 ...

最新文章

  1. 主动学习综述(ACTIVE LEARNING)
  2. php实现cc攻击防御和防止快速刷新页面示例
  3. 【Groovy】闭包 Closure ( 自定义闭包参数 | 自定义单个闭包参数 | 自定义多个闭包参数 | 闭包参数默认值指定 )
  4. 微信好友大揭秘,使用Python抓取朋友圈数据,通过人脸识别全面分析好友,一起看透你的“朋友圈”...
  5. epub阅读器_推荐一款Epub(windows版)阅读软件,附下载安装教程
  6. “小罐茶大师作”20亿元销售额难掩虚假宣传本质
  7. 该虚拟机似乎正在使用
  8. xss测试工具(xsstrike基于python)
  9. Nodejs 操作 MongoDb 数据库
  10. 数论 —— 斐波那契数列(Fibonacci)
  11. IntelliJ IDEA:文件的路径本该是”\“,却变成了”¥“
  12. Laravel 启动流程分析 (代码全流程)
  13. JavaScript菜鸽子基础知识总结(一)
  14. C++primer 6.7节练习
  15. 典型信息化案例点评(2)
  16. C++windows环境管道通信
  17. 尚硅谷javaWeb书城项目第一阶段 用js实现
  18. 用来用去,Python脚本打包 exe还是这款工具最棒
  19. 连花清瘟对德尔塔病毒有效?这次网友反应不太一样
  20. 短信导出工具V1.3

热门文章

  1. java非静态内部类如何创建对象实例
  2. 初探ASP.NET Mvc5+EF7的美妙旅程
  3. Android NDK 剥离符号信息
  4. CF1041B Buying a TV Set
  5. zabbix 创建触发器
  6. android assets目录在哪,Android Studio 中 assets目录的使用
  7. Tally项目笔记001
  8. java bufferedreader读大文件会内存溢出吗_【JVM成长系列】实战内存溢出异常
  9. a4b5笔记本大小对比_2L大小的迷你电脑上班拎着走
  10. mysqlplus 批量插入_解决SpringBoot+Druid+Mybatis Plus 执行MySQL批量插入,更新 报错的问题...