基本语法
在 Qt 中,允许⾃定义信号的发送⽅以及接收⽅,即可以⾃定义信号函数和槽函数。但是对于⾃定义的
信号函数和槽函数有⼀定的书写规范。
-
⾃定义信号函数书写规范
(1)⾃定义信号函数必须写到 “signals” 下;
(2)返回值为 void,只需要声明,不需要实现;
(3)可以有参数,也可以发⽣重载; -
⾃定义槽函数书写规范
(1)早期的 Qt 版本要求槽函数必须写到 “public slots” 下,但是现在⾼级版本的 Qt 允许写到类的"public" 作⽤域中或者全局下;
(2)返回值为 void,需要声明,也需要实现;
(3)可以有参数,可以发⽣重载; -
发送信号
使⽤ “emit” 关键字发送信号 。“emit” 是⼀个空的宏。“emit” 其实是可选的,没有什么含义,只
是为了提醒开发⼈员。
⽰例1:
-
在 widget.h 中声明⾃定义的信号和槽,如图所⽰;
-
在 widget.cpp 中实现槽函数,并且关联信号和槽
⽰例2:当⽼师说 “上课了”,学⽣们就 “回到座位,开始学习”。
- 在源⽂件中新建两个类,⼀个是⽼师类,⼀个是学⽣类
在 Qt 中新建类时, 要选择新建类的⽗类.
显然,当前项⽬中还没啥类适合做新类的⽗类, 同时新的类也不是⼀个 “窗⼝” 或者 “控件”. 这种情况
⼀般选择 QObject 作为基类.
这样做的好处是这个新类的对象可以搭配 Qt 的对象树机制. 便于对象的正确释放.
对于 “学⽣类” 以上述同样的⽅式进⾏添加,添加完成之后,项⽬⽬录新增⽂件如下:
在 teacher.h 中声明信号函数:
在 student.h 中声明槽函数:
在 widget.h 中实例化 “⽼师类对象” 和 “学⽣类对象”;
在 student.cpp 中实现槽函数:
在 widget.cpp 中连接⾃定义信号和槽;
⽰例3:⽼师点击 “按钮” 触发学⽣上课;
运⾏结果如下图⽰:
带参数的信号和槽
Qt 的信号和槽也⽀持带有参数, 同时也可以⽀持重载.
此处我们要求, 信号函数的参数列表要和对应连接的槽函数参数列表⼀致.
此时信号触发, 调⽤到槽函数的时候, 信号函数中的实参就能够被传递到槽函数的形参当中.
⽰例1:重载信号槽
(1)在 “widget.h” 头⽂件中声明重载的信号函数以及重载的槽函数;如下图所⽰:
(2)在 “Widget.cpp” ⽂件实现重载槽函数以及连接信号和槽。
在定义函数指针时要指明函数指针的作⽤域。
(3)执⾏结果如下图所⽰:
⽰例2:信号槽参数列表匹配规则
-
在 “widget.h” 头⽂件中声明信号和槽函数;
-
在 “widget.cpp” ⽂件中实现槽函数以及连接信号和槽;
其实信号的参数个数可以多于槽函数的参数个数,但是槽的参数个数不能多于信号参数个数.
但是实际开发中最好还是保持参数个数也能匹配⼀致
⽰例3:
-
在 “widget.h” 头⽂件中声明信号和槽函数;
-
在 “widget.cpp” ⽂件中实现槽函数以及连接信号和槽;