QT信号与槽-自定义信号和槽

时间:2024-04-12 11:33:34

基本语法

在 Qt 中,允许⾃定义信号的发送⽅以及接收⽅,即可以⾃定义信号函数和槽函数。但是对于⾃定义的
信号函数和槽函数有⼀定的书写规范。

  1. ⾃定义信号函数书写规范
    (1)⾃定义信号函数必须写到 “signals” 下;
    (2)返回值为 void,只需要声明,不需要实现;
    (3)可以有参数,也可以发⽣重载;

  2. ⾃定义槽函数书写规范
    (1)早期的 Qt 版本要求槽函数必须写到 “public slots” 下,但是现在⾼级版本的 Qt 允许写到类的"public" 作⽤域中或者全局下;
    (2)返回值为 void,需要声明,也需要实现;
    (3)可以有参数,可以发⽣重载;

  3. 发送信号
    使⽤ “emit” 关键字发送信号 。“emit” 是⼀个空的宏。“emit” 其实是可选的,没有什么含义,只
    是为了提醒开发⼈员。

⽰例1:

  1. 在 widget.h 中声明⾃定义的信号和槽,如图所⽰;
    在这里插入图片描述

  2. 在 widget.cpp 中实现槽函数,并且关联信号和槽
    在这里插入图片描述

⽰例2:当⽼师说 “上课了”,学⽣们就 “回到座位,开始学习”。

  1. 在源⽂件中新建两个类,⼀个是⽼师类,⼀个是学⽣类
    在这里插入图片描述

在这里插入图片描述

在 Qt 中新建类时, 要选择新建类的⽗类.
显然,当前项⽬中还没啥类适合做新类的⽗类, 同时新的类也不是⼀个 “窗⼝” 或者 “控件”. 这种情况
⼀般选择 QObject 作为基类.
这样做的好处是这个新类的对象可以搭配 Qt 的对象树机制. 便于对象的正确释放.

在这里插入图片描述
对于 “学⽣类” 以上述同样的⽅式进⾏添加,添加完成之后,项⽬⽬录新增⽂件如下:
在这里插入图片描述
在 teacher.h 中声明信号函数:
在这里插入图片描述
在 student.h 中声明槽函数:
在这里插入图片描述
在 widget.h 中实例化 “⽼师类对象” 和 “学⽣类对象”;
在这里插入图片描述
在 student.cpp 中实现槽函数:
在这里插入图片描述
在 widget.cpp 中连接⾃定义信号和槽;
在这里插入图片描述

⽰例3:⽼师点击 “按钮” 触发学⽣上课;

在这里插入图片描述
运⾏结果如下图⽰:
在这里插入图片描述

带参数的信号和槽

Qt 的信号和槽也⽀持带有参数, 同时也可以⽀持重载.
此处我们要求, 信号函数的参数列表要和对应连接的槽函数参数列表⼀致.
此时信号触发, 调⽤到槽函数的时候, 信号函数中的实参就能够被传递到槽函数的形参当中.

⽰例1:重载信号槽
(1)在 “widget.h” 头⽂件中声明重载的信号函数以及重载的槽函数;如下图所⽰:
在这里插入图片描述
(2)在 “Widget.cpp” ⽂件实现重载槽函数以及连接信号和槽。
在定义函数指针时要指明函数指针的作⽤域。
在这里插入图片描述
(3)执⾏结果如下图所⽰:
在这里插入图片描述

⽰例2:信号槽参数列表匹配规则

  1. 在 “widget.h” 头⽂件中声明信号和槽函数;
    在这里插入图片描述

  2. 在 “widget.cpp” ⽂件中实现槽函数以及连接信号和槽;
    在这里插入图片描述
    其实信号的参数个数可以多于槽函数的参数个数,但是槽的参数个数不能多于信号参数个数.
    但是实际开发中最好还是保持参数个数也能匹配⼀致

⽰例3:

  1. 在 “widget.h” 头⽂件中声明信号和槽函数;
    在这里插入图片描述

  2. 在 “widget.cpp” ⽂件中实现槽函数以及连接信号和槽;
    在这里插入图片描述