zoukankan      html  css  js  c++  java
  • Qt5教程: (5) Lambda匿名函数的使用

    Lambda是C++11的新特性, 首先看看你的.pro项目文件里有没有CONFIG += c++11这句话, 没有就加上.
    下面新建一个工程, 具体步骤就不多说了

    然后给主窗口添加一个按钮b, 并且包含头文件, 下面要用.

    我们先来看一下匿名函数最简单的使用

    connect(&b, &QPushButton::clicked,
                [] ()
                {
                    qDebug() << "1111";
                }
                );
    

    之后保存运行, 点击按键会发现, 1111被打印出来了.

    这个匿名函数到底是什么东西呢?
    []:

    • 这个方括号是用来传递外部变量的, 因为在匿名函数中是无法使用外部变量的, 只能通过方括号传递给他, 才能捕获到. 比如 我需要使用b这个变量, 只需要在方括号中加入b即可:
        [b] ()
        {
        }
        ``` 
    - 但是如果要传的变量很多, 一个个加到方括号里就太麻烦了, 这时我们可以使用 '=', 将外部所有局部变量、类中所有成员以值传递方式传进来: `[=] ()`. 但是通过这种方式传递进来的变量是只读的, 不能修改, 需要在后面加mutable关键字: 
    ```cpp
        [=] () mutable
        {
        }
        ```
    - 使用 this, 可以把类中所有成员以值传递方式传递进来:
    ```cpp
        [this] ()
        {
        }
        ```
    - 使用 &, 把外部所有局部变量, 通过引用方式传递进来(不推荐, 容易出错)
    ```cpp
        [&] ()
        {
        }
        ```
    
    **()**:
    - 括号用来接收信号的参数
    
    **{}**:
    - 花括号内为匿名函数的逻辑代码.
    
    我们来试一下带参数的用法, `QPushButton::clicked`是带参数`bool checked`的, 它的默认值为false, 鼠标悬停在`QPushButton::clicked`上, 按下F1即可跳转到Qt文档:
    ![](https://img2018.cnblogs.com/blog/1365872/201908/1365872-20190807213124465-1961868481.png)
    我们通过匿名函数来打印这个参数的值:
    ```cpp
    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()
    {
    
    }
    
    

    此文原创禁止转载,转载文章请联系博主并注明来源和出处,谢谢!
    作者: Raina_RLN https://www.cnblogs.com/raina/

  • 相关阅读:
    P3478 [POI2008]STA-Station
    P2015 二叉苹果树
    P2014 选课 (树型背包模版)
    求树的每个子树的重心
    求树的直径
    Javascript--防抖与节流
    JavaScript中call和apply的区别
    解决谷歌浏览器“此Flash Player与您的地区不相容,请重新安装Flash”问题(最新版)
    matlab实验代码(总)
    表达式树
  • 原文地址:https://www.cnblogs.com/raina/p/11318012.html
Copyright © 2011-2022 走看看