【Qt开发】信号与槽(一)

发布于:2025-07-25 ⋅ 阅读:(15) ⋅ 点赞:(0)

目录

1 -> 信号和槽概述

1.1 -> 信号的本质

1.2 -> 槽的本质

2 -> 信号与槽的连接方式

2.1 -> 一对一

2.2 -> 一对多

2.3 -> 多对一

3 -> 小结


1 -> 信号和槽概述

在 Qt 中,用户和控件的每次交互过程称为一个事件。比如 “用户点击按钮” 是一个事件,“用户关闭窗口也是一个事件”。,每个事件都会发出一个信号,例如用户点击按钮会发出 “按钮被点击” 的信号,用户关闭窗口会发出 “窗口被关闭” 的信号。

Qt 中的所有控件都具有接收信号的能力,一个控件还可以接收多个不同的信号。对于接收到的每个信号,控件都会做出相应的响应动作。例如,按钮所在的窗口接收到 “按钮被点击” 的信号后,会做出“关闭自己”的相应动作;再比如输入框自己接收到 “输入框被点击” 的信号后,会做出 “显示闪烁的光标,等待用户输入数据” 的响应动作。在 Qt 中,对信号做出的响应动作就称之为槽。

信号和槽是 Qt 特有的消息传输机制,它能将互相独立的控件关联起来、比如,“按钮” 和 “窗口” 本身是两个独立的控件,点击 “按钮” 并不会对 “窗口” 造成任何影响。通过信号和槽机制,可以将 “按钮” 和 “窗口” 关联起来,实现 “点击按钮会使窗口关闭” 的效果。

1.1 -> 信号的本质

信号是由于用户对窗口或控件进行了某些操作,导致窗口或控件产生了某个特定事件,这时 Qt 对应的窗口类会发出某个信号,以此对用户的操作做出反应。因此,信号的本质就是事件。如:

  • 按钮单击、双击
  • 窗口刷新
  • 鼠标移动、鼠标按下、鼠标释放
  • 键盘输入

那么问题来了,在 Qt 中信号是通过什么形式呈现给使用者呢?

  • 我们对哪个窗口进行操作,哪个窗口就可以捕捉到这些被触发的事件
  • 对于使用者来说,触发了一个事件我们就可以得到 Qt 框架给我们发出的某个特定信号
  • 信号的呈现形式就是函数,也就是说某个事件产生了,Qt 框架就会调用某个对应的信号函数,通知使用者。

在 Qt 中信号的发出者是某个实例化的类对象。

1.2 -> 槽的本质

 槽(Slot)就是对信号响应的函数。槽就是一个函数,与一般的 C++ 函数是一样的,可以定义在类的任何位置(public、protected 或 private),可以具有任何参数,可以被重载,也可以被直接调用(但是不能有默认参数)。槽函数与一般的函数不同的是:槽函数可以与一个信号关联,当信号被发射时,关联的槽函数被自动执行。

说明

  1. 信号和槽机制底层是通过函数间的相互调用实现的。每个信号都可以用函数来表示,称为信号函数;每个槽也可以用函数表示,称为槽函数。例如:“按钮被按下” 这个信号可以用 clicked() 函数表示,“关闭窗口” 这个槽可以用 close() 函数表示,假如使用信号和槽机制实现:“点击按钮会关闭窗口” 的功能,其实就是 clicked() 函数调用 close() 函数的效果。
  2. 信号函数和槽函数通常位于某个类中,和普通的成员函数相比,它们的特别之处在于:
    • 信号函数用 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 -> 小结

一、核心概念

  1. 信号本质:用户操作控件产生的事件(如点击按钮、关闭窗口)触发Qt框架自动调用的信号函数,是事件在代码层的表现形式

  2. 槽本质:响应信号的成员函数,具有普通函数特性(可重载、带参数),但需用slots关键字修饰

  3. 核心机制:通过信号函数调用槽函数实现对象间解耦通信(如点击按钮触发窗口关闭)

二、连接方式

  1. 一对一连接

    • 信号→槽:基础连接(如按钮点击触发处理函数)

    • 信号→信号:实现信号级联传递(如按钮A点击触发按钮B的信号)

  2. 一对多连接

    • 单信号→多槽:信号触发时多个槽函数按连接顺序执行

  3. 多对一连接

    • 多信号→单槽:不同信号触发同一处理逻辑(如多个按钮共用响应函数)

三、关键特性

  • 信号只需声明(Qt自动生成实现),槽需完整定义

  • 通过QObject::connect()建立连接关系

  • 支持灵活的事件响应链设计(信号级联、多路响应)

  • 实现控件间解耦交互(如按钮与窗口独立对象通过信号槽关联)

四、核心价值
提供安全的事件驱动通信框架,使GUI组件能独立开发并通过信号槽动态组合功能,大幅提升Qt应用的模块化程度和可维护性。


感谢各位大佬支持!!!

互三啦!!!


网站公告

今日签到

点亮在社区的每一天
去签到