码迷,mamicode.com
首页 > 其他好文 > 详细

Qt5教程 (5) Lambda匿名函数的使用

时间:2019-08-07 22:29:11      阅读:379      评论:0      收藏:0      [点我收藏+]

标签:qwidget   文件   conf   没有   object   end   png   code   widget   

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教程 (5) Lambda匿名函数的使用

标签:qwidget   文件   conf   没有   object   end   png   code   widget   

原文地址:https://www.cnblogs.com/raina/p/11318012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!