信号和槽理解

信号和槽可以理解为,两个人之间的通信。

  • 发出者,发出信号
  • 接受者根据信号做出一些行为,行为写在槽函数里面
  • 信号和槽通过connect进行连接

当点击按钮btn2时会执行关闭当前窗口的操作(connect里面传的4个参数都是指针)

connect(btn2,&QPushButton::clicked,this,&QWidget::close);

自定义信号

在QT里面声明一个类的时候,会自带一个signals,我们只需要把要定义信号申明到类中即可,不需要写实现(信号不需要动作)
teacher.h文件

自定义槽函数

我们可以自定义一个槽函数来执行我们接收到信号之后的一些操作。槽函数直接定义到接受者的中的public权限中,并需要在.cpp文件中实现槽函数。

槽函数在.h文件中的申明
student.h文件

槽函数在.cpp文件中的实现。
student.cpp文件

信号与槽函数之间的连接

信号与槽函数无参情况下

这种写法仅仅适合,信号与槽函数都是无参的情况,但是信号与槽函数是支持重载的,如果重载一个有参的信号或者槽函数,编译器就不知道要调用哪个型号或者槽函数了。

connect(wh,&teacher::hungry,stu,&student::treat);

信号与槽函数有参情况下(无参也推荐这种写法)

我们可以定义一个函数指针,指向指定的函数地址
当前例子为两个空参函数,如果函数是有参修改括号里面的void即可

	//函数指针  指向地址
    void (teacher::*teacherSignal)(void)=&teacher::hungry;
    void (student::*studentSlot)(void)=&student::treat;
    //信号槽连接
    connect(wh,teacherSignal,stu,studentSlot);

有参的信号和槽函数,只需要把括号里面的内容修改成参数的数据类型即可

void (teacher::*teacherSignal)(QString)=&teacher::hungry;
    void (student::*studentSlot)(QString)=&student::treat;

信号与槽函数的注意事项

  • 信号与槽函数连接时对他们两个的参数是有限制的
  • 信号的参数可以多余槽的参数,但是槽函数有的参数,信号必须得有
  • 简而言之,槽有的信号一定得有,信号有的槽可以没有

lambda表达式

  • 使用lambda表达式可以在写槽函数的时候直接使用匿名函数
  • lambda表达式的格式——{}
  • []里面放=代表值传递 ,放&代表地址传递 捕获内容是当前对象
  • ()里面放lambda函数的参数
  • 如果函数需要返回值->int{}, int这里代表返回值类型
 connect(btn2,&QPushButton::clicked, [=](){
        btn2->setText("aaaa");
    });

结果展示

在这里插入图片描述

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐