目录
Qt信号和槽
谈到信号,设计3个要素
信号源:谁发出了信号
信号触发条件:哪个控件的哪个函数被调用了,用户进行了不同的操作,会触发不同的操作
信号处理方式:需要哪个控件的哪个函数进行处理
信号处理方式也可以被称为:槽(slot) 即处理函数 也可称为槽函数
Qt可以利用connet 将信号和槽关联起来
connect函数
是QObject提供的静态成员函数
QObject是所有控件的祖宗
connect使用方法
对Button进行点击,Widget就会关闭
信号函数和槽函数的图标区别
传入的是函数指针,为什么const char*能接受?
const char*是之前的写法,现在使用了宏替代
Qt5 开始,对connect使用了泛型编程,不需要进行转换,所以就有了现在的写法。
自定义信号 与 自定义槽
Qt界面化工具自动生成的槽
在连接信号和槽时不是需要connect?
除了connect,Qt还可以使用函数名来自动连接
pushButton 发送信号对象 (ui中的对象名)
clicked 信号
头文件中自动生成了这个函数
tips:
如果我们是通过图形化界面创建控件,可以直接使用快速生成槽的方式
但是我们通过代码来创建时,需要手动去connect,因为就算将函数名写对,在头文件中没有这个connectSlotByName函数的声明;
自定义信号
在实际开发中很少使用到自定义信号
1.信号在Qt中是一个特殊的函数,我们需要对这个自定义信号进行声明,并且告诉编译器这是个信号函数
2.信号的返回值必须是void
扫描到类中的signals关键字时,会自动将以下函数声明认为是信号,并且给这些信号函数自动生成函数定义
Qt也提供了emit关键字 但是其实emit啥也没做😂 建议还是加上 代码的可读性会更高
带参数的信号和槽
信号和槽,也可以自带参数
但是信号和槽的必须传入相同的参数,主要是类型一致,但是数量不一致时,信号中的参数数量也必须必槽参数数量多
Qt中很多内置信号也自带参数
为什么这么设计 :信号中的参数数量也必须必槽参数数量多
一个槽函数,有可能会绑了多个信号
如果只是完全的一对一,那么意味着信号绑定个槽的要求会更高
如果这么设计,就允许信号和槽的绑定更灵活。
Qt中要让某个类能够使用信号和槽,需要给类中添加Q_OBJECT宏
信号与槽的断开
1.使用disconnect来断开连接
与connect用法上非常类似
使用Lambda表达式定义槽函数