目录

QT信号和槽

【QT:信号和槽】

QT信号涉及的三要素:信号源、信号类型、信号的处理方式。

给按钮的点击操作关联一个处理函数,用户点击按钮时触发,对应的处理函数就会执行

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

QT中使用connect函数将信号和槽关联起来,信号触发,QT自动执行槽函数,槽函数的本质为“回调函数”。实例如下:

使用控件,右击鼠标,转到槽,然后选择信号

https://i-blog.csdnimg.cn/direct/4d6415d0c28c4a0a92b737572987e52f.png https://i-blog.csdnimg.cn/direct/2c70169eed124f408ecab756a6940980.png

https://i-blog.csdnimg.cn/direct/87f57df929fc4963b65bbc7d18d04b32.png

这里没有使用connect函数,也能让标题发生变化,是因为在QT中除了connect函数连接信号槽之外,还可以通过函数名自动连接。 https://i-blog.csdnimg.cn/direct/e3cf6bc1716a48a68359cc520a7fad5b.png

开发中大部分情况需要自定义槽函数,槽函数是用户触发某个操作要进行的业务逻辑。信号对应的是用户的某个操作,在 GUI中,用户操作可以穷举。

而自定义信号,程序员只需要写出函数的声明并告知QT这是一个信号,而该信号的定义则是QT在编译过程中自动生成的。

作为信号函数,函数的返回值必须是void,有无参数都可以,支持函数重载。QT中 signals 是QT扩展的关键字

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

但是建立连接并不代表信号发出来了

https://i-blog.csdnimg.cn/direct/999c057d5b944bb4b338c3c73b0a91c7.png

QT中自定义信号需要我们自己手动设置,而为什么QT中的信号不需要我们手动设置?

发射信号的代码已经内置到QT框架了,用户在GUI进行某种操作就会自动触发对应的信号

自定义信号书写实例: https://i-blog.csdnimg.cn/direct/d370c7997e6a4df5a43d1900676ca0c4.png

  • 使用按钮控件将信号置于控件中,同样实现自动发送
  • 信号发送后,连接建立
  • 通过连接触发对应的槽函数

  1. 信号参数可以多于槽函数的参数,但是不可以少于槽函数的参数,这样的规定让信号和槽函数之间的绑定更加灵活
  2. 槽函数会按照参数的顺序拿到信号前N个参数,至少确保槽函数的每个参数都是有值的
  3. QT信号槽的机制是为了解耦合和多对多的响应
  4. 信号槽的任务本质就是响应用户的操作

1.使用disconnect函数断开信号槽的连接,disconnect的使用与connect相似,主动断开往往是把信号重新绑定到另一个槽函数上 https://i-blog.csdnimg.cn/direct/d7c218993dc243e9ab6e316adcde6775.png

槽函数的定义可以使用Lambda表达式,本质是一个匿名函数吧,主要应用“回调函数”中

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

lambda表达式是一个回调函数,该函数无法直接获取上层作用域的变量,为了解决该问题,lambda引入了一个捕捉列表

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

如果当前Lambda要使用更多的外层变量,直接将[ ]中填入=即可,实例如下:

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

https://i-blog.csdnimg.cn/direct/59808c0b91c040cdab8655c7628f5839.png

[=]的含义就是将上层作用域中所有的变量名都捕获进来,lambda语法是C++11引入的,如果使用QT4或者更老的版本需要手动在.pro文件上加C++11的编译选项,而QT5以上的版本默认按照C++11编译