【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)
  • 信号/槽参数类型必须严格匹配(可通过编译检查)

感谢各位大佬支持!!!

互三啦!!!

相关推荐
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁3 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
孙启超3 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust
此生决int3 天前
深入理解C++系列(20)——C++11(下)
开发语言·c++
慧都小项3 天前
当边缘AI上产线:QtitanDocking 如何让工业 HMI 实现多视图协同
人工智能·qt·ui·边缘计算·qt6.3
CoderYanger3 天前
A.每日一题:835. 图像重叠
java·开发语言·程序人生·leetcode·面试·职场和发展·学习方法
伞伞悦读3 天前
【第37期】Python JSON 与配置详解:序列化、反序列化、嵌套结构和配置文件
开发语言·python·json
CCCCCCCCharlie3 天前
Linux进程控制四大核心操作
linux·开发语言