注1:本系列文章使用的Qt版本为Qt 6.3.1
注2:本系列文章常规情况下不会直接贴出源码供复制,都以图片形式展示。所有代码,自己动手写一写,记忆更深刻。
信号与槽是Qt特有的机制,它并不是C++的。在我们创建基本C++的类时是不能进行信号的发送与槽的实现的。
任何类要使用信号与槽机制都必须继承于QObject类或其子类,同时还要在类的定义中写入Q_OBJECT宏。如下图:
这其实是笔者常问面试者的一个问题,该问题的答案很简单:回调函数。那如何声明一个信号以及槽函数呢?如下图:
信号与槽在声明、定义时两者其实毫无关联,若要将信号与槽关联起来,必须使用connect函数。如下图:
简单说一下就是,当信号接收者接收到信号发送者发出的信号时,就执行一次槽函数。
注:槽函数也可作为普通函数使用,它与普通函数的区别就是它可以响应信号。
答案是:可以。但是如果是跨线程使用信号与槽时,需要先注册参数的元对象类型。如下图:
答案是:部分情况可以。详情如图:
打开帮助文档,在索引处输入"connect",并找到"connect"双击。
选择QObject Class并显示。我们可以看到,在查询出来的文档中,connect函数是具有五个参数的,不过第五个是默认值,且平时我们几乎不用。
点击第五个参数的类型,跳转到其说明。如下图:
后面就是每个枚举类型的相关说明。简单说一下,从上往下,依次的含义为:
①默认值,若信号发送者与接收者位于同一线程则采用②,否则采用③
②接到信号时立即响应槽函数,槽函数在信号所在的线程中执行。
③等到信号发送方执行完成后,回到信号接收者所在的线程中再执行。
④基本与③相同,不同之处在于,会把信号发送者所在的线程先阻塞,先返回接收者所在线程执行槽函数。
⑤一个标志位,使用 | 与①-④相结合,可以避免重复connect相同的信号与槽。
⑥Qt6新增的标志位,使用 | 与①-④相结合,可以让信号与槽成功激发一次后直接就断开连接,后续该信号无法被该槽函数响应。