Qt5教程 Lambda匿名函数的使用
Posted raina
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt5教程 Lambda匿名函数的使用相关的知识,希望对你有一定的参考价值。
Lambda是C++11的新特性, 首先看看你的.pro项目文件里有没有CONFIG += c++11
这句话, 没有就加上.
下面新建一个工程, 具体步骤就不多说了
然后给主窗口添加一个按钮b, 并且包含头文件
我们先来看一下匿名函数最简单的使用
connect(&b, &QPushButton::clicked,
[] ()
qDebug() << "1111";
);
之后保存运行, 点击按键会发现, 1111被打印出来了.
这个匿名函数到底是什么东西呢?
[]:
这个方括号是用来传递外部变量的, 因为在匿名函数中是无法使用外部变量的, 只能通过方括号传递给他, 才能捕获到. 比如 我需要使用b这个变量, 只需要在方括号中加入b即可:
[b] ()
但是如果要传的变量很多, 一个个加到方括号里就太麻烦了, 这时我们可以使用 ‘=‘, 将外部所有局部变量、类中所有成员以值传递方式传进来:
[=] ()
. 但是通过这种方式传递进来的变量是只读的, 不能修改, 需要在后面加mutable关键字:[=] () mutable
使用 this, 可以把类中所有成员以值传递方式传递进来:
[this] ()
使用 &, 把外部所有局部变量, 通过引用方式传递进来(不推荐, 容易出错)
[&] ()
():
- 括号用来接收信号的参数
:
- 花括号内为匿名函数的逻辑代码.
我们来试一下带参数的用法, QPushButton::clicked
是带参数bool checked
的, 它的默认值为false, 鼠标悬停在QPushButton::clicked
上, 按下F1即可跳转到Qt文档:
我们通过匿名函数来打印这个参数的值:
connect(&b, &QPushButton::clicked,
[=] (bool value)
qDebug() << value;
);
保存后运行, 按下按钮, 输出false:
使用Lambda的方法比之前自己创建槽函数可方便多了!!!
附录
mainwidget.h
#ifndef MAINWIDGET_H
#define MAINWIDGET_H
#include <QWidget>
#include <QPushButton>
#include <QDebug>
class MainWidget : public QWidget
Q_OBJECT
public:
MainWidget(QWidget *parent = 0);
~MainWidget();
private:
QPushButton b;
;
#endif // MAINWIDGET_H
mainwidget.cpp
#include "mainwidget.h"
MainWidget::MainWidget(QWidget *parent)
: QWidget(parent)
resize(200, 200);
b.setParent(this);
b.setText("按钮");
b.move(50, 50);
connect(&b, &QPushButton::clicked,
[=] (bool value)
qDebug() << value;
);
MainWidget::~MainWidget()
以上是关于Qt5教程 Lambda匿名函数的使用的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin中匿名函数(又称为Lambda,或者闭包)的详解