目录
1 -> 信号和槽概述
在 Qt 中,用户和控件的每次交互过程称为一个事件。比如 “用户点击按钮” 是一个事件,“用户关闭窗口也是一个事件”。,每个事件都会发出一个信号,例如用户点击按钮会发出 “按钮被点击” 的信号,用户关闭窗口会发出 “窗口被关闭” 的信号。
Qt 中的所有控件都具有接收信号的能力,一个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。例如,按钮所在的窗口接收到 “按钮被点击” 的信号后,会做出“关闭自己”的相应动作;再比如输入框自己接收到 “输入框被点击” 的信号后,会做出 “显示闪烁的光标,等待用户输入数据” 的响应动作。在 Qt 中,对信号做出的响应动作就称之为槽。
信号和槽是 Qt 特有的消息传输机制,它能将互相独立的控件关联起来、比如,“按钮” 和 “窗口” 本身是两个独立的控件,点击 “按钮” 并不会对 “窗口” 造成任何影响。通过信号和槽机制,可以将 “按钮” 和 “窗口” 关联起来,实现 “点击按钮会使窗口关闭” 的效果。
1.1 -> 信号的本质
信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时 Qt 对应的窗口类会发出某个信号,以此对用户的操作做出反应。因此,信号的本质就是事件。如:
- 按钮单击、双击
- 窗口刷新
- 鼠标移动、鼠标按下、鼠标释放
- 键盘输入
那么问题来了,在 Qt 中信号是通过什么形式呈现给使用者呢?
- 我们对哪个窗口进行操作,哪个窗口就可以捕捉到这些被触发的事件
- 对于使用者来说,触发了一个事件我们就可以得到 Qt 框架给我们发出的某个特定信号
- 信号的呈现形式就是函数,也就是说某个事件产生了,Qt 框架就会调用某个对应的信号函数,通知使用者。
在 Qt 中信号的发出者是某个实例化的类对象。
1.2 -> 槽的本质
槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的 C++ 函数是一样的,可以定义在类的任何位置(public、protected 或 private),可以具有任何参数,可以被重载,也可以被直接调用(但是不能有默认参数)。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。
说明
- 信号和槽机制底层是通过函数间的相互调用实现的。每个信号都可以用函数来表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。例如:“按钮被按下” 这个信号可以用 clicked() 函数表示,“关闭窗口” 这个槽可以用 close() 函数表示,假如使用信号和槽机制实现:“点击按钮会关闭窗口” 的功能,其实就是 clicked() 函数调用 close() 函数的效果。
- 信号函数和槽函数通常位于某个类中,和普通的成员函数相比,它们的特别之处在于:
- 信号函数用 signals 关键字修饰,槽函数用 public slots、protected slots 或者 private slots 修饰。signals 和 slots 是 Qt 在 C++ 的基础上扩展的关键字,专门用来指明信号函数和槽函数;
- 信号函数只需要声明,不需要定义(实现),而槽函数需要定义(实现)。
注意
信号函数的定义是 Qt 自动在编译程序之前生成的。编写 Qt 应用程序时无需关注。
这种自动生成代码的机制称为 元编程(Meta Programming)。这种操作在很多场景都能见到。
2 -> 信号与槽的连接方式
2.1 -> 一对一
主要有两种形式,分别是:一个信号连接一个槽 和 一个信号连接一个信号。
一. 一个信号连接一个槽
示例:
1. 在 “widget.h” 中声明信号和槽以及信号发射函数。
2. 在 “widget.cpp” 中实现槽函数,信号发射函数以及连接信号和槽。
二. 一个信号连接另一个信号
示例:
在上述示例基础上,在 “widget.cpp” 文件中添加如下代码:
2.2 -> 一对多
一个信号连接多个槽
示例:
1. 在 “widget.h” 头文件中声明一个信号和三个槽。
2. 在 “widget.cpp” 文件中实现槽函数以及连接信号和槽。
2.3 -> 多对一
多个信号连接一个槽函数
示例:
1. 在 “widget.h” 头文件中声明两个信号以及一个槽。
2. 在 “widget.cpp” 文件中实现槽函数以及连接信号和槽。
3 -> 小结
一、核心概念
信号本质:用户操作控件产生的事件(如点击按钮、关闭窗口)触发Qt框架自动调用的信号函数,是事件在代码层的表现形式
槽本质:响应信号的成员函数,具有普通函数特性(可重载、带参数),但需用
slots
关键字修饰核心机制:通过信号函数调用槽函数实现对象间解耦通信(如点击按钮触发窗口关闭)
二、连接方式
一对一连接
信号→槽:基础连接(如按钮点击触发处理函数)
信号→信号:实现信号级联传递(如按钮A点击触发按钮B的信号)
一对多连接
单信号→多槽:信号触发时多个槽函数按连接顺序执行
多对一连接
多信号→单槽:不同信号触发同一处理逻辑(如多个按钮共用响应函数)
三、关键特性
信号只需声明(Qt自动生成实现),槽需完整定义
通过
QObject::connect()
建立连接关系支持灵活的事件响应链设计(信号级联、多路响应)
实现控件间解耦交互(如按钮与窗口独立对象通过信号槽关联)
四、核心价值
提供安全的事件驱动通信框架,使GUI组件能独立开发并通过信号槽动态组合功能,大幅提升Qt应用的模块化程度和可维护性。
感谢各位大佬支持!!!
互三啦!!!