当前位置: 首页 > news >正文

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

目录

1 -> 连接信号和槽

2 -> 查看内置信号和槽

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

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

感谢各位大佬支持!!!

互三啦!!!

http://www.xdnf.cn/news/1195921.html

相关文章:

  • 积分兑换小程序Java
  • 深入理解 Spring 中的 XmlBeanFactory 原理及实践
  • 数据结构第1问:什么是数据结构?
  • Java 大视界 -- Java 大数据机器学习模型在电商客户细分与精准营销活动策划中的应用(367)
  • 【牛客网C语言刷题合集】(四)
  • PostgreSQL并发控制
  • 机器学习鸢尾花案例
  • KingbaseES聚焦产品上线
  • docker与k8s的容器数据卷
  • 自由学习记录(74)
  • 多租户Kubernetes集群架构设计实践——隔离、安全与弹性扩缩容
  • MYSQL--再谈间隙锁和临键锁
  • RabbitMq 常用命令和REST API
  • 商品中心—1.B端建品和C端缓存
  • Python-初学openCV——图像预处理(四)——滤波器
  • 命令行和neovim的git操作软件-lazygit
  • sealos 方式安装k8s5节点集群
  • 自动标注软件X-AnyLabeling的使用教程
  • 基于动态增强的 LLM 置信度方法研究
  • C语言中:形参与实参的那些事
  • [SAP ABAP] ALV报表练习4
  • Matlab自学笔记六十五:解方程的数值解法(代码速成)
  • 文件IO——bmp图像处理
  • 磁悬浮轴承转子不平衡质量控制策略设计:原理、分析与智能实现
  • 基于java的在线教育平台管理系统、在线学习系统的设计与实现
  • 零基础学习性能测试第三章:jmeter性能组件应用(事件,并发,定时器)
  • 哈尔滨←→南昌的铁路要道
  • AWD的攻击和防御手段
  • idea中无法删除模块,只能remove?
  • 2025年7月26日训练日志