简述

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. activiti自己定义流程之Spring整合activiti-modeler5.16实例(四):部署流程定义
  2. Linux C编程--进程介绍1--进程的创建
  3. CentOS7安装MySQL(完整版)
  4. int i 引出JVM故事
  5. 防止html标签转义
  6. P4 前端编译器p4c-bm、后端编译器bmv2命令安装 make error问题
  7. linux不挂断运行python文件
  8. StegaStamp:加州大学伯克利分校开源神奇的照片隐写术,打印的照片能当二维码用...
  9. 使用RMAN对数据文件进行恢复
  10. UnityShader26:运动模糊
  11. bat批量修改及替换文件内容
  12. 金蝶ERP实现产品入库及委外加工冲减生产现场虚仓毛坯数(修正版07-05-10)
  13. Matlab The Bisection Method
  14. C 线程同步的四种方式(Windows)
  15. Javascript特效:长图滚动
  16. 过程FMEA(PFMEA)步骤一:策划与准备
  17. 小米笔记本重装win10系统教程
  18. windows下svn server的安装和配置
  19. JAVA名字正则表达式(包含新疆姓名)
  20. 一眼就吸引人的网名「引人注目」

热门文章

  1. 01_商城项目设计与工程搭建
  2. [github高级控件]带你走近-自定义标签云
  3. vue点击下载图片的实现
  4. java response 输出word_java导出数据到word(一)
  5. 丁可以组什么词_“一”可以组什么词?落语读书会学期总结
  6. java源码编译_java 源码编译
  7. adminlte3 动态菜单_一本科学菜单,十倍利润增长 | 跟巴奴学餐饮业的精简风:菜单越薄,利润越厚!...
  8. dd命令打包多个文件_linux下如何tar打包多个并列文件夹,如:将a文件夹 b文件夹 c文件夹,打包成d.tar文件...
  9. python嵌套字典的建立_python学习之第八篇——字典嵌套之字典中嵌套字典
  10. 异步任务,HttpContext.Current为null解决办法