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/

  • 相关阅读:
    Notes of Daily Scrum Meeting(12.18)
    Notes of Daily Scrum Meeting(12.17)
    Notes of Daily Scrum Meeting(12.16)
    Notes of Daily Scrum Meeting(12.8)
    Notes of Daily Scrum Meeting(12.5)
    Notes of Daily Scrum Meeting(12.3)
    Notes of Daily Scrum Meeting(11.12)
    Linux中profile、bashrc、bash_profile之间的区别和联系
    Linux GCC编译
    mysql 5.7.16 远程连接
  • 原文地址:https://www.cnblogs.com/raina/p/11318012.html
Copyright © 2011-2022 走看看