文章目录

  • 一、前言
  • 二、什么是Lamda表达式?
    • 2.1、 Lambda 表达式的语法
    • 2.2、Lambda函数的捕获列表
  • 三、在Qt中使用Lambda表达式函数
    • 3.1、信号连接Lambda
    • 3.2、使用信号传递的参数
  • 四、总结

一、前言

Lambda 表达式是在 C++11 中加入的 C++ 特性,利用Lambda 表达式在编写代码时更加方便,而且代码更具有可阅读性。

使用Qt的信号槽的时候,就可以省略定义槽函数、实现槽函数以及添加全局变量的烦人步骤。

二、什么是Lamda表达式?

Lambda 表达式(lambda expression)是一个匿名函数,即没有函数名的函数。Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象。

匿名这个称呼不算太陌生,在c语言里,定义结构体的时候,有时候会涉及到匿名这个概念。比如

struct {int data;
}a,b;
// 定义了一个结构体,结构体名称没人在乎,只知道有包含了int类型数据域的变量 a,b,但是变量a和b的类型是 struct unnamed

同理,匿名函数也是差不多的, 但是语法有点奇怪。

2.1、 Lambda 表达式的语法

   [capture](parameters) mutable ->return-type { function body }
// [捕获列表] (参数列表) mutable -> 返回类型 { 函数体 }
// 其中除了“[]”(捕获列表,可以为空)和“{ 函数体 }”,其它都是可选的。
  1. [ capture ] :捕捉列表。
    表示Lambda函数的开始,实际上,是Lambda引出符。编译器根据该引出符判断接下来的代码是否是Lambda函数。
    捕捉列表能够捕捉上下文中的变量以供Lambda函数使用,可以为空。
  2. ( parameters ):参数列表
    与普通函数的参数列表一致。如果不需要参数传递,则可以连同括号“()”一起省略;
  3. mutable :mutable 修饰符
    默认情况下,Lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,“()”参数列表不可省略(即使参数为空);
  4. ->return-type:尾置的返回类型
    尾置函数的返回类型。可以在不需要返回值的时候也可以连同符号”->”一起省略。此外,在返回类型明确的情况下,也可以省略该部分,让编译器对返回类型进行自动推导;
  5. { function body }:函数体
    与普通函数一样,不过除了可以使用参数之外,还可以使用所有捕获的变量。
// 普通函数
int max( int a, int b ) {return  a > b ? a : b;
}// lamda表达式函数 利用auto关键字和类型推导,如果不用auto关键字,max就需要声明成:  int (*max)(int &,int &)
auto max = [] ( int &a, int &b ) {return  a > b ? a : b;
};//由于Lambda表达式函数一旦固定,则其类型就固定。利用auto
//全部类型都基于类型推断的泛型lambda表达式
auto max = [] ( auto &a, auto &b ) {return  a > b ? a : b;
};

2.2、Lambda函数的捕获列表

Lambda函数可以通过捕获列表访问一些上下文中的数据。具体地,捕捉列表描述了上下文中哪些数据可以被Lambda使用,以及使用方式(以值传递的方式或引用传递的方式)。语法上,在“[ ]”包括起来的是捕捉列表,捕捉列表由多个捕捉项组成,并以逗号分隔。

捕捉列表有以下几种形式:

  1. [ var ]表示值传递方式捕捉变量var;
  2. [ = ]表示值传递方式捕捉所有父作用域的变量(包括this);
  3. [ &var ]表示引用传递捕捉变量var;
  4. [ & ]表示引用传递方式捕捉所有父作用域的变量(包括this);
  5. [ this ]表示值传递方式捕捉当前的this指针。

上面提到了一个父作用域,也就是包含Lambda函数的语句块,说通俗点就是包含Lambda的“{}”代码块。上面的捕捉列表还可以进行组合,例如:

  1. [=,&a,&b]表示以引用传递的方式捕捉变量a和b,以值传递方式捕捉其它所有变量;
  2. [&,a,this]表示以值传递的方式捕捉变量a和this,引用传递方式捕捉其它所有变量。

不过值得注意的是,捕捉列表不允许变量重复传递。下面一些例子就是典型的重复,会导致编译时期的错误。例如:

  1. [=,a]这里已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错的;
  2. [&,&this]这里&已经以引用传递方式捕捉了所有变量,再捕捉this也是一种重复。

三、在Qt中使用Lambda表达式函数

Lambda 表达式可以通过 “获取” 来使用当前父作用域中的变量。

3.1、信号连接Lambda

#include <QtWidgets>int main(int argc, char *argv[])
{QApplication a(argc, argv);QPushButton btn("Click");btn.show();QObject::connect(&btn,&QPushButton::clicked,[&]{qDebug() << btn.text();});return a.exec();
}

3.2、使用信号传递的参数

#include <QtWidgets>int main(int argc, char *argv[])
{QApplication a(argc, argv);QSlider slider(Qt::Horizontal);slider.show();QObject::connect(&slider,&QAbstractSlider::valueChanged,[&](int val){qDebug() << val;});return a.exec();
}

四、总结

通过上面这两个小例子,还是可以清晰地感受到使用Lambda表达式所带来的便利。特别是在使用Qt的widgets时,用代码写界面是,可以在widget的构造函数里直接关联信号与Lambda表达式函数,而省略了一大堆的成员变量、槽函数等。

Qt 工具类(05):在Qt里使用Lamda表达式相关推荐

  1. 从Qt 4到Qt 5(二)Qt 5框架介绍

    导语 上一节已经安装好Qt 5.2,并将一个Qt 4程序迁移到了Qt 5上.其中我们讲到Qt 5中QApplication类已经不在QtGui模块中了,而且所有的Qt 5图形界面程序都必须在.pro项 ...

  2. springboot整合quartz实现动态添加、修改、删除、停止job,以及优化quartz工具类,支持自动停止逻辑

    原文链接:http://pengfeiguo.com/article/16 什么是Quartz? 一个定时任务调度框架,简单易用,功能强大可以使实现定时任务的. 优点: 支持集群下定时任务处理 支持任 ...

  3. JAVA-生成Cron表达式生成工具类

    一般在写定时任务的时候都是后台定义好的定时时间,但根据不同的项目需求需要客户去配置某个时间段的定时,把操作权给用户 所以就需要后端人员通过前端传值的方式来实现定时任务配置; 补充一下core表达式官网 ...

  4. 开发工具(二)Qt Creator类

    文章目录 1. QT简介 1.1 QT常用的命令(快捷键) 2 QT常用概念 2.1 绝对路径 和 相对路径 3 QT发布Linux/Windows可执行程序 3.1 QT发布Linux可执行程序 3 ...

  5. Pycharm创建QT工具

    安装工具包pyqt5和PyQt5-tools 添加环境变量 把上面变量添加到Paty中 Pycharm创建QT工具 先添加Qt-Designer应用 $FileDir$ $ ProjectFileDi ...

  6. C++ Qt 05:Qt布局管理器 - 荒 木 - 博客园

    C++ Qt 05:Qt布局管理器 - 荒 木 - 博客园 下面我们以一个例子来初步了解Qt的组件定位技术,比如我们想做一个登录窗口,像下图这样,应该怎么做呢? 这还不简单嘛,在窗体上拖两个QLabe ...

  7. Qt的对话框与窗口--Qt中主要的窗体类及其用途

    Qt中主要的窗体类及其用途     常用的窗体基类是QWidget.QDialog和QMainWindow,在创建GUI应用程序时选择窗体基类就是从这3个类中选择.QWidget直接继承于QObjec ...

  8. QT QVariant类数据类型使用

    QT QVariant类数据类型使用 1. QVariant 类用于封装数据成员的类型及取值等信息,该类类似于 C++ 共用体 union ,一个QVariant 对象,一次只能保存一个单一类型的值. ...

  9. 1.4 Qt工具之Qt Linguist介绍

    转自:http://www.hellotongtong.com/Qt5base1/qtlinguist-intro.html 1.4 Qt工具之Qt Linguist介绍 ***[免费下载源码和PPT ...

最新文章

  1. 绿联网卡转接mac设置_物联网卡这样设置一下上网全程4G!建议收藏!
  2. mongoDB3.0.2 升级操作
  3. android内存及内存溢出分析
  4. Apollo进阶课程㉜丨Apollo ROS原理—1
  5. tensorflow : gfile 函数
  6. 19.UNIX 环境高级编程--伪终端
  7. 程序员新电脑装机软件
  8. 卧槽!出了一个Python实时目标跟踪系统神器!
  9. 【 开源计划 - Flutter组件 】 星星也可以如此闪耀 flutter_star
  10. 状态码中400错误和405错误怎么解决
  11. 大学生会计技能竞赛总决赛(三)
  12. 2017 Python 问卷调查结果初步分析
  13. 传奇单机架设图文教程
  14. 国产32位单片机使用-APT32F102x
  15. 【雷达通信】滤波及数据融合【滤波包括了常增益滤波、卡尔曼(Kalman)滤波和扩展卡尔曼滤波(EKF) 数据融合采用BC和CC两种,基于KF和EKF实现】(Matlab代码实现)
  16. 基于深度学习目标检测和人体关键点检测的不健康坐姿检测
  17. deepin系统没有声音的解决方法
  18. python 如何换行
  19. 计算机一级操作题题库在线,全国计算机一级考试题库操作题
  20. java旅游管理开题答辩ppt,旅游管理开题报告

热门文章

  1. 怎样把网页上的音频转换成mp3格式?试试这几个转换方法
  2. django部署 nginx 配置简单的负载均衡
  3. 中国传统文化期末论文——大爱庄子
  4. 基于微信奶茶外卖小程序商城毕业设计 毕设源码 开题报告参考
  5. unity urp 获取屏幕深度法向颜色纹理以及从深度纹理重构世界空间坐标
  6. AOS库使滚动动画变得很酷
  7. 4.使用Office Open XML SDK访问Excel2007数据表
  8. liner中文翻译_liner是什么意思_liner的翻译_音标_读音_用法_例句_爱词霸在线词典...
  9. 八大方法预防鼻炎发作
  10. 高德地图计算多个轨迹点的距离