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