目录

Qt-信号与槽-

Qt 信号与槽


Qt信号和槽

谈到信号,设计3个要素

信号源 :谁发出了信号

信号触发条件 :哪个控件的哪个函数被调用了,用户进行了不同的操作,会触发不同的操作

信号处理方式 :需要哪个控件的哪个函数进行处理

信号处理方式也可以被称为:槽(slot) 即处理函数 也可称为槽函数

Qt可以利用connet 将信号和槽关联起来

connect函数

是QObject提供的静态成员函数

QObject是所有控件的祖宗

https://i-blog.csdnimg.cn/direct/29771d57c08443b39eed2f6fbe070088.png

connect使用方法

https://i-blog.csdnimg.cn/direct/00df0074f3a941149f35128678e2b6e9.png

对Button进行点击,Widget就会关闭

https://i-blog.csdnimg.cn/direct/ceb1f8e7d72c4fea8fadc6fa33a5bfb1.png

信号函数和槽函数的图标区别

https://i-blog.csdnimg.cn/direct/6d9183ac1abc44568f1c5d35822b6cdb.png

传入的是函数指针,为什么const char*能接受?

const char*是之前的写法,现在使用了宏替代

https://i-blog.csdnimg.cn/direct/97e891ec55164ab7bf3008382798de98.png

Qt5 开始,对connect使用了泛型编程,不需要进行转换,所以就有了现在的写法。

自定义信号 与 自定义槽

https://i-blog.csdnimg.cn/direct/bcb65af3b4ac48a18ac73d4288f1e8e3.png

Qt界面化工具自动生成的槽

https://i-blog.csdnimg.cn/direct/9502d7af7f9343359ffe40eddf05ed55.png

在连接信号和槽时不是需要connect?

除了connect,Qt还可以使用函数名来自动连接

https://i-blog.csdnimg.cn/direct/729c93e444f145dd87274b432066ac78.png

pushButton 发送信号对象 (ui中的对象名)

https://i-blog.csdnimg.cn/direct/815a773e8631416e90d8be0735b408fb.png

clicked 信号

头文件中自动生成了这个函数

https://i-blog.csdnimg.cn/direct/9862d444586c4f489fcbdcc8f0171fcc.png

tips:

如果我们是通过图形化界面创建控件,可以直接使用快速生成槽的方式

但是我们通过代码来创建时,需要手动去connect,因为就算将函数名写对,在头文件中没有这个connectSlotByName函数的声明;

自定义信号

在实际开发中很少使用到自定义信号

1.信号在Qt中是一个特殊的函数,我们需要对这个自定义信号进行声明,并且告诉编译器这是个信号函数

2.信号的返回值必须是void

https://i-blog.csdnimg.cn/direct/47323c2df38b45f5a18e8e853ebe04d6.png

扫描到类中的signals关键字时,会自动将以下函数声明认为是信号,并且给这些信号函数自动生成函数定义

https://i-blog.csdnimg.cn/direct/9bfc0d4be5a542d7a5824d1d78542773.png

Qt也提供了 emit 关键字 但是其实emit啥也没做😂 建议还是加上 代码的可读性会更高

带参数的信号和槽

信号和槽,也可以自带参数

但是信号和槽的必须传入相同的参数,主要是类型一致,但是数量不一致时,信号中的参数数量也必须必槽参数数量多

https://i-blog.csdnimg.cn/direct/48e37c730cb3429caaf49c68e7215229.png

Qt中很多内置信号也自带参数

https://i-blog.csdnimg.cn/direct/802a7ff9014643d1bc712ce202088ac1.png

为什么这么设计 : 信号中的参数数量也必须必槽参数数量多

一个槽函数,有可能会绑了多个信号

如果只是完全的一对一,那么意味着信号绑定个槽的要求会更高

如果这么设计,就允许信号和槽的绑定更灵活。

Qt中要让某个类能够使用信号和槽,需要给类中添加Q_OBJECT宏

https://i-blog.csdnimg.cn/direct/1df0685147164d62b80ef14c2d7c8ad5.png

信号与槽的断开

1.使用disconnect来断开连接

与connect用法上非常类似

使用Lambda表达式定义槽函数

https://i-blog.csdnimg.cn/direct/ee8490e07a024f229be5873bd79ca8ed.png