Qt lambda 简化你的代码 connect 写法示例 省略槽函数定义

简述
lambda   (来姆达啊) 很标准哈哈
英 /ˈlæmdə/  美 /ˈlæmdə/
百度百科

“Lambda 表达式”(lambda
expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambdaabstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

个人理解

匿名在于它不属于哪个类的方法,可以直接在函数内部进行实现。

你需要一个函数,但是又不想声明和命名函数,就可以使用匿名函数。

很意外的发现了这种表达式,还是在Java的Up主公众号上看到的。
误以为没C++什么事,后来发现在Java、Python和C++中都可以使用这种特性,C++11有支持。

Qt5.4版本以后均可以直接使用。之前的版本需要在pro文件中添加

CONFIG += c++11

这是由c++编译器 提供支持的

代码示例

先好奇 再讲语法
一个简单的按钮文本反转实现 点击“打开” 再点“关闭”

在这里插入图片描述在这里插入图片描述

	//WRONG connect(m_pBtnTest,SIGNAL(clicked()),[=](bool isCheck){
    connect(m_pBtnTest,&QPushButton::clicked,[=](bool isCheck){
        if(isCheck)
            m_pBtnTest->setText("打开");
        else
            m_pBtnTest->setText("关闭");
    });

省去了声明槽函数,定义槽函数的麻烦,是不是爽多了。很多时候根本就不想去声明槽函数,跳来跳去,就只想写那么一两句。早就想干掉这种麻烦,如今解决了。

lambda语法

以下只说常用的语法,3分钟学会 具体语法大家可以百度深入了解

一个完整的lambda表达式有以下5个部分 值传递方式、参数声明、修饰、返回类型、函数实现

[=] (QString strId) mutable ->int {
	qDebug()<<strId;
}
  1. [] //不可省略 可为空
    函数对象参数是传递给编译器自动生成的函数对象类的构造函数的。
    函数对象参数只能使用那些到定义 Lambda 为止时 Lambda 所在作用范围内可见的局部变量(包括 Lambda 所在类的 this)。函数对象参数有以下形式:
  • = 值传递
  • & 引用传递
  • this 传递this指针
  • m_strId 值方式传递变量 函数体内不可修改此变量的值 因为默认的是const 除非添加了mutable修饰
//可多种传递方式
[=,&m_strId,&m_strName] //m_strId m_strName 两个变量是引用方式传递 其他变量值传递
[&,=a]  //除a 意外的变量都是引用方式传递
  1. () //可省略不写
    函数参数

  2. mutable/exception //可省略不写
    声明: 按值传递函数对象参数时,加上 mutable 修饰符后,可以修改传递进来的拷贝(注意是能修改拷贝,而不是值本身)。exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)。

  3. -> //可省略不写
    返回值类型 标识函数返回值的类型,当返回值为 void,或者函数体中只有一处 return 的地方(此时编译器可以自动推断出返回值类型)

  4. {} //不可省略 可为空
    函数的具体实现

完整代码示例
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void initUI();
signals:
    void sigClick(QString strText);
private:
    QPushButton *m_pBtnTest;
};
#endif // MAINWINDOW_H

#include "mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    initUI();
}

void MainWindow::initUI()
{
    m_pBtnTest = new QPushButton(this);
    m_pBtnTest->move(20,20);
    m_pBtnTest->setText("打开");
    m_pBtnTest->setCheckable(true);

    /*用法一*/
   connect(m_pBtnTest,&QPushButton::clicked,[=](bool isCheck){
        if(isCheck)
            m_pBtnTest->setText("打开");
        else
            m_pBtnTest->setText("关闭");
        
        emit sigClick(m_pBtnTest->text());
    });

    /*用法2*/
    auto irq = [=](QString strBtnText){
        qDebug()<<strBtnText;
    };
    connect(this,&MainWindow::sigClick,irq);
}


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是唐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值