【Qt开发】信号与槽(二)-> 信号和槽的使用

目录

[1 -> 连接信号和槽](#1 -> 连接信号和槽)

[2 -> 查看内置信号和槽](#2 -> 查看内置信号和槽)

[3 -> 通过 Qt Creator 生成信号槽代码](#3 -> 通过 Qt Creator 生成信号槽代码)

[4 -> 小结](#4 -> 小结)


1 -> 连接信号和槽

在 Qt 中,QObject 类提供了一个静态成员函数 connect(),该函数专门用来关联指定的信号函数和槽函数。

关于 QObject:

QObject 是 Qt 内置的父类。Qt 中提供的很多类都是直接或者间接继承自 QObject。这一设定是与 Java 十分相似。

connect() 函数原型:

connect (const QObject *sender,
const char *signal ,
const QObject *receiver ,
const char *method ,
Qt::ConnectionType type = Qt::AutoConnection )

参数说明:

  • sender:信号的发送者;
  • signal:发送的信号(信号函数);
  • receiver:信号的接收者;
  • method:接收信号的槽函数;
  • type:用于指定关联方式,默认的关联方式为 Qt::AutoConnection,通常不需要手动设定。

**代码示例:**在窗口中设置一个按钮,当点击 "按钮" 时关闭 "窗口"。

2 -> 查看内置信号和槽

系统自带的信号和槽通常是通过 "Qt 帮助文档" 来查询。

如上述示例,要查询 "按钮" 的信号,在帮助文档中输入:QPushButton

  • 首先可以在 "Contents" 中寻找关键字 signals
  • 如果没有找到,继续去父类中寻找。因此我们去其父类 QAbstractButton 中继续查找关键字 signals。

这里的 clicked() 就是要找的信号。槽函数的寻找方式和信号一样,只不过它的关键字是 slot

3 -> 通过 Qt Creator 生成信号槽代码

Qt Creator 可以快速帮助我们生成信号槽相关的代码。

代码示例:在窗口中设置一个按钮,当点击 "按钮" 时关闭 "窗口"。

1. 新建项目,如下图为新建完成之后所包含的所有文件;

注意:创建时要生成 UI 设计文件。

2. 双击 widget.ui 文件,进入 UI 设计界面。

3. 在 UI 设计窗口中拖入一个 "按钮",并且修改 "按钮" 的名称及字体大小等。

4. 可视化生成槽函数。

当单击 "转到槽......" 之后,出现如下界面:对于按钮来说,当点击时发送的信号是:clicked(),所以此处选择为 clicked()

对于普通按钮来说,使用 clicked 信号即可,clicked(bool) 没有意义的,具有特殊状态的按钮(比如复选按钮)才会用到 clicked(bool)

5. 自动生成槽函数原型框架。

(1)在 "widget.h" 头文件中自动添加槽函数的声明

说明:

自动生成槽函数的名称有一定的规则。

槽函数的命名规则为:on_AAA_BBB,其中:

  1. "on" 开头,中间使用下划线连接起来
  2. "AAA" 表示对象名(控件的 objectName 属性)
  3. "BBB" 表示的是对应的信号

如:"on_pushButton_clicked()",PushButton 代表的是对象名,clicked 是对应的信号。

注意:

按照这种命名风格定义的槽函数,就会被 Qt 自动的和对应的信号进行连接。

所以最好不要依赖命名规则,最好显式使用 connect。

一方面显式 connect 可以更清晰直观的描述信号和槽的连接关系。

另一方面也防止信号或槽的名字拼写错误导致连接失效。

(2)在 "widget.cpp" 中自动生成槽函数定义。

6. 在槽函数的函数定义中添加要实现的功能。

实现关闭窗口效果

4 -> 小结

1. 连接函数 connect()

  • 通过 QObject::connect() 建立信号与槽的关联
  • 关键参数:
    • sender:信号发送对象指针
    • signal:信号函数地址(格式:&类名::信号名)
    • receiver:槽函数所属对象指针
    • method:槽函数地址
  • 默认使用 Qt::AutoConnection(自动根据线程选择连接方式)

2. 内置信号与槽查询方法

  • Qt帮助文档是核心工具:
  1. 搜索控件类名(如 QPushButton)
  2. 在父类(如 QAbstractButton)中查找 Signals 区域
  3. 槽函数同理查找 Slots 区域
  • 继承链查询:若当前类无信号/槽,需向上层父类追溯

3. Qt Creator自动生成代码

  • 操作流程:
    • UI设计器中右键控件 → "转到槽"
    • 选择信号(如按钮的 clicked())
  • 生成规则:
    • 槽函数命名:on_控件对象名_信号名()
    • 示例:按钮 objectName="pushButton" → 生成 on_pushButton_clicked()
  • 注意事项:
    • 自动连接依赖命名规范,易因拼写错误失效
    • 推荐显式connect:代码可读性更高,避免隐式错误

4. 最佳实践与风险提示

  • 优先使用 显式connect 而非自动生成槽
  • 跨线程通信需关注连接类型(如 Qt::QueuedConnection)
  • 信号/槽参数类型必须严格匹配(可通过编译检查)

感谢各位大佬支持!!!

互三啦!!!

相关推荐
almighty271 分钟前
C# WPF实现ComboBox实时搜索与数据绑定
开发语言·c#·wpf·combobox
菜鸟小九13 分钟前
SSM(MybatisPlus)
java·开发语言·spring boot·后端
数据知道16 分钟前
Go基础:常用数学函数处理(主要是math包rand包的处理)
开发语言·后端·golang·go语言
学习同学17 分钟前
从0到1制作一个go语言服务器 (一) 配置
服务器·开发语言·golang
大飞pkz21 分钟前
【设计模式】桥接模式
开发语言·设计模式·c#·桥接模式
数据知道34 分钟前
Go基础:文件与文件夹操作详解
开发语言·后端·golang·go语言
珍宝商店1 小时前
原生 JavaScript 方法实战指南
开发语言·前端·javascript
神龙斗士2401 小时前
Java 数组的定义与使用
java·开发语言·数据结构·算法
白露与泡影1 小时前
2025互联网大厂高频Java面试真题解析
java·开发语言·面试
gopyer1 小时前
180课时吃透Go语言游戏后端开发2:Go语言中的变量
开发语言·游戏·golang·游戏后端开发