Qt开发基础(3)——Lambda表达式应用

本文介绍了C++11中Lambda表达式的应用,展示了如何在Qt中无需显式定义信号和槽函数,如何利用Lambda表达式简洁地处理信号传递。主要涉及主窗口和子窗口的交互,以及如何利用Lambda在按钮释放事件中动态修改变量和执行自定义操作。
摘要由CSDN通过智能技术生成

Lambda表达式应用可以不需要指定信号和槽函数,很方便:

Lambda表达式:匿名对象函数 //C++11增加的新特性。 //如果需要Qt一起使用需要在项目文件.pro文件添加CONFIG += C++11   //qt配合信号一起使用非常的方便

注意:如果信号有参数,在()里面要加上参数

mainwidget.h

#ifndef MAINWIDGET_H
#define MAINWIDGET_H

#include <QWidget>
#include<QPushButton>
#include"subwidget.h" //倒入子窗口头文件

class MainWidget : public QWidget
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = nullptr);
    ~MainWidget();
    void mySlot();
    void changeWin();
    void dealSubWin();//处理子窗口
    void dealSlot(int, QString);

private:
    QPushButton b1;
    QPushButton *b2;
    QPushButton b3;

    SubWidget w;//创建子窗口类的对象
};
#endif // MAINWIDGET_H

 subwidget.h

#ifndef SUBWIDGET_H
#define SUBWIDGET_H

#include <QWidget>
#include<QPushButton>

class SubWidget : public QWidget
{
    Q_OBJECT
public:
    explicit SubWidget(QWidget *parent = nullptr);
    void sendSlot();//子窗口的槽函数定义

signals:
/*
信号必须有signals关键字来声明
信号没有返回值,但可以有参数
信号就是函数的声明,只需要声明,无需定义
使用:emit mySignal();
信号可以重载
*/

    void mysignal();
    void mysignal1(int, QString);
private:
    QPushButton b;

};

#endif // SUBWIDGET_H

mainwidget.cpp(注意)

#include "mainwidget.h"
#include<QPushButton>
#include<QDebug>//打印

MainWidget::MainWidget(QWidget *parent)
    : QWidget(parent)
{
    b1.setParent(this);
    b1.setText(QStringLiteral("取消"));
    b1.move(100,100);

    //b2是一个指针,需要动态分布空间
    b2 = new QPushButton(this);//通过构造函数指定父对象
    b2->setText("abc");

    //点击“取消”按钮就关闭
    /*
    connect()建立连接函数:
    (1)&b1:信号发出者,必须是指针类型,如果要是把b2按退出就应该改为b2不需要加&,因为b2本身就是指针类型
    (2)&QPushButton::pressed:表示处理的信号.格式为:&发送者的类名::信号的名字
    (3)this:信号的接收者
    (4)&MainWidget::close:槽函数,信号处理函数。 格式为:&接收者的类名::槽函数的名字
    */
    connect(&b1,&QPushButton::pressed,this,&MainWidget::close);

    //自定义槽之前先进信号看看是否有返回值和参数,再定义槽函数
    //实现按下抬起的abc按钮的时候,按钮的文本变为123
    //released表示按下抬起的时候
    connect(b2, &QPushButton::released,this,&MainWidget::mySlot);
    //如果我们不让this接收,也可以让b1接收,改为如下:按b2当抬起的时候把b1隐藏
    connect(b2, &QPushButton::released,&b1,&QPushButton::hide);

    setWindowTitle(QStringLiteral("老大"));
    b3.setParent(this);
    b3.setText(QStringLiteral("切换到子窗口"));
    b3.move(50,50);

    //显示子窗口
//    w.show();

//完成案例:当我们按下抬起“切换”的按钮的时候,首先隐藏当前的窗口,然后要展现子窗口(这是完成两部,所以需要自定义槽函数)
    connect(&b3,&QPushButton::released,this,&MainWidget::changeWin);

    //处理子窗口的信号
    connect(&w,&SubWidget::mysignal1,this,&MainWidget::dealSubWin);//Qt5的写法

    //Lambda表达式:匿名对象函数
    //C++11增加的新特性。
    //如果需要Qt一起使用需要在项目文件.pro文件添加CONFIG += C++11
    //qt配合信号一起使用非常的方便

    //创建一个按钮进行案例分析
    QPushButton *b4 = new QPushButton(this);//创建指针并指父对象
    b4->setText("Lambda");
    b4->move(150,150);
    int a=10;
    int b=100;
    connect(b4,&QPushButton::released,
       //在这里面写函数主体,由于是匿名函数没有函数名,但是有一个[],[]的作用就是把外部变量传进函数体,可以传很多
        [=]()mutable//把b4传进来进行处理就填入b4,如果外部有很多我们都需要用,我们可以直接传一个“=”等号,表示把外部所有局部变量、类中所有成员都传进来
        {
            b4->setText("123");
            qDebug()<<"11111";
            qDebug()<<a<<b;
            a=11;//加一个mutable就可以修改值了,不然不可以修改只能读
        }
        );

    resize(400,300);

}

void MainWidget::mySlot()
{
    b2->setText("123");
}

void MainWidget::changeWin()
{
    //子窗口显示
    w.show();
    //本窗口隐藏
    this->hide();
}

void MainWidget::dealSubWin()
{
    w.hide();
    this->show();
}

void dealSlot(int a, QString str)
{
    //str.toUtf8().data()转化为字节数组QByteArray
    qDebug()<<a<<str.toUtf8().data();//显示中文
}

MainWidget::~MainWidget()
{
}

subwidget.cpp

#include "subwidget.h"


SubWidget::SubWidget(QWidget *parent) : QWidget(parent)
{
    setWindowTitle(QStringLiteral("小弟"));//也可以这样写this-> setWindowTitle("小弟");
    b.setParent(this);
    b.setText(QStringLiteral("切换到主窗口"));
    connect(&b, &QPushButton::released,this,&SubWidget::sendSlot);//在子窗口只是和主窗口建立链接,真正的实现效果在主窗口设定

    resize(400,300);
}

void SubWidget::sendSlot()
{
    emit mysignal();
    //由于信号是给槽函数传参的,信号有几个参数参函数就有几个
    emit mysignal1(250, QStringLiteral("我是子窗口"));
}

点击Lambda案件,变成了123

 点击继续点击123输出111,打印a,b,值,发现a值改变了,利用了mutable

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI炮灰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值