根据B站《最新QT从入门到实战完整版|传智教育》学习的,BV号:BV1g4411H78N
Lambda表达式
[ ]标识符,匿名函数,[ ]( ){ }
1.= 值传递
2.& 引用传递
3.( )参数
4.{ }实现体
5.mutable修饰值传递变量,可以修改拷贝出的数据,改变不了本体
6.返回值 [ ]( )->返回值类型{ }
7.调用函数 [ ]( ){ }( );
Lambda表达式最常用 [=]( ){ }
案例
widget.cpp:其余代码看前面的文章!
#include "widget.h"
#include "ui_widget.h"
#include<QPushButton>
#include<QDebug>
//Teacher类 老师类
//Student类 学生类
//下课后,老师会触发一个信号“饿了”,学生响应信号然后“请客吃饭”
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//创建一个老师对象
this->t = new Teacher(this);
//创建一个学生对象
this->st = new Student(this);
//连接不带参数的信号和槽
// //老师饿了学生请客的连接
// connect(t,&Teacher::hungry,st,&Student::treat);
// //调用下课函数
// ClassIsOver();
//连接带参数的信号和槽
//指针 -> 地址
//函数指针 -> 函数地址
void(Teacher:: * teacherSignal)(QString) = &Teacher::hungry; //定义函数指针
void(Student:: * studentSlot)(QString) = &Student::treat;
connect(t,teacherSignal,st,studentSlot);
//ClassIsOver();
//点击下课按钮再触发下课
QPushButton * btn = new QPushButton("下课",this);
//重置窗口大小
this->resize(600,400);
//点击按钮,触发下课
//connect(btn,&QPushButton::clicked,this,&Widget::ClassIsOver);
//无参信号和槽连接
void(Teacher:: * teacherSignal2)(void) = &Teacher::hungry;
void(Student:: * studentSlot2)(void) = &Student::treat;
connect(t,teacherSignal2,st,studentSlot2);
//信号连接信号
connect(btn,&QPushButton::clicked,t,teacherSignal2);
//断开信号
//disconnect(t,teacherSignal2,st,studentSlot2);
//拓展
//1.信号是可以连接信号的
//2.一个信号可以连接多个槽函数
//3.多个信号可以连接同一个槽函数
//4.信号和槽的参数类型必须一一对应
//5.信号的参数个数可以多于槽函数的参数个数
//Qt4版本以前的信号和槽的连接方式
//利用Qt4信号槽,连接无参版本
//Qt4版本 底层SIGNAL("hungry") SLOT("treat")
//connect(t,SIGNAL(hungry()),st,SLOT(treat()));
//Qt4版本优点:参数直观 缺点:类型不做检测
//lambda表达式
//中括号中的 = 为值传递,包含局部变量中的所有变量,包括所在类的this
//中括号中的 & 为引用传递
// [=](){
// btn->setText("aaaa");
// }();
//只包含stn(空括号中的变量)
// QPushButton * btn2 = new QPushButton;
// [stn](){
// btn->setText("aaa");
// btn2->setText("bbbb"); //btn2看不到
// }
//mutable关键字,用于修饰值传递的变量,修改的是拷贝,而不是本体
// QPushButton * myBtn = new QPushButton(this);
// QPushButton * myBtn2 = new QPushButton(this);
// myBtn2->move(100,100);
// int m = 10;
// connect(myBtn,&QPushButton::clicked,this,[m]()mutable{m = 100 + 10; qDebug() << m;});
// connect(myBtn2,&QPushButton::clicked,this,[=](){ qDebug() << m;});
// qDebug() << m;
// int ret = []()->int{return 1000;}();
// qDebug() << "ret = " << ret;
//利用lambda表达式,实现点击窗口关闭窗口
QPushButton * btn2 = new QPushButton;
btn2->move(100,0);
btn2->setText("关闭");
btn2->setParent(this);
connect(btn2,&QPushButton::clicked,this,[=](){ //第三个参数是this的话可以省略掉
// this->close();
// emit t->hungry("宫保鸡丁");
btn2->setText("aaa");
});
//lambda表达式最常用[=](){}
}
void Widget::ClassIsOver()
{
//下课函数,调用后触发老师饿了的信号
//emit t->hungry();
emit t->hungry("宫保鸡丁");
}
Widget::~Widget()
{
delete ui;
}