【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,其中:
- 以 “on” 开头,中间使用下划线连接起来
- “AAA” 表示对象名(控件的 objectName 属性)
- “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帮助文档是核心工具:
- 搜索控件类名(如 QPushButton)
- 在父类(如 QAbstractButton)中查找 Signals 区域
- 槽函数同理查找 Slots 区域
- 继承链查询:若当前类无信号/槽,需向上层父类追溯
3. Qt Creator自动生成代码
- 操作流程:
- UI设计器中右键控件 → "转到槽"
- 选择信号(如按钮的 clicked())
- 生成规则:
- 槽函数命名:on_控件对象名_信号名()
- 示例:按钮 objectName="pushButton" → 生成 on_pushButton_clicked()
- 注意事项:
- 自动连接依赖命名规范,易因拼写错误失效
- 推荐显式connect:代码可读性更高,避免隐式错误
4. 最佳实践与风险提示
- 优先使用 显式connect 而非自动生成槽
- 跨线程通信需关注连接类型(如 Qt::QueuedConnection)
- 信号/槽参数类型必须严格匹配(可通过编译检查)
感谢各位大佬支持!!!
互三啦!!!