简述

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. 如何在鼠标hover时改变标注的样式
  2. 小明分享:8ms平台入门教程
  3. ORACLE10回收站-Recyclebin
  4. CIO们对数据中心虚拟化心存的六大疑虑
  5. Java基础入门笔记-随机数
  6. python怎么发布pycharm_如何使用PyCharm将代码上传到GitHub上(图文详解)
  7. 【MySQL性能优化的21个最佳实践】
  8. 一本通1619【例 1】Prime Distance
  9. MYSQL BENCHMARK()函数
  10. PyCharm+PyTorch0.4.0安装使用
  11. 信息系统安全等级保护三级的基本要求 引用的规范文件
  12. 窝囊同事做测试三年未涨工资,被开当天,bat全部高管门口迎接。
  13. python中matplotlib的plot函数
  14. 正向有功正向无功_电表的正向有功和反向无功的详细解读
  15. 计算机网络常用知识总结!
  16. 人工智能html5背景,HTML5人工智能基础及实践
  17. 微信小程序 保存图片 wx.saveImageToPhotosAlbum
  18. 【luogu CF1009F】Dominant Indices(长链剖分优化DP)
  19. 生财有术:及时止损,及时止损,及时止损
  20. ROS学习| navigation基本导航

热门文章

  1. android查看cpu型号_笔记本电脑cpu处理器怎么看?
  2. vue-router在3.0版本以上重复点击菜单报错的问题
  3. 希捷srd0nf1移动硬盘是叠瓦盘吗_最值得买的固态移动硬盘推荐-最佳固态移动硬盘排行榜【2020年10月】...
  4. python爬虫线上编辑_Python 爬虫入门《中》
  5. 黑苹果内置硬盘识别成外置硬盘_压倒U盘最后一根稻草?ORICO iMatch移动固态硬盘体验...
  6. mysql 使用中_phpmyadmin显示MySQL数据表“使用中” 修复后依然无效的解决方法
  7. android 悬浮按钮出现隐藏,Android悬浮窗按钮实现点击并显示/隐藏多功能列表
  8. python怎么利用gpu加速_python怎么利用gpu加速
  9. Java中stringbutter_java 中String和StringBuffer与StringBuilder的区别及使用方法
  10. 华为手机计算机小游戏,华为手机怎么玩自带小游戏 | 手游网游页游攻略大全