深入Qt信号槽

简述

信号槽机制是观察者模式的一种应用,达到订阅-发布的效果。与之类似的有C#中的委托机制,只是写法有所不同。

深入信号槽

1. 使用场合

信号槽实现的主体是connect函数,常有两种写法(利用SIGNAL、SLOT宏和使用&类名::函数的结构)。
需要注意connect除了可以连接信号和槽,还可以连接信号与信号、单个信号与多个槽、多个信号与单个槽。

2. 第五个参数

connect函数有第五个参数,第五个参数主要是用来处理线程间数据的传递。
1)Qt::AutoConnection
默认的参数,可以省略。不需要跨线程传递的等价于Qt::DirectConnection,需要跨线程传递的等价于Qt::QueuedConnection。
2)Qt::DirectConnection
信号发送后槽函数立刻被调用,槽函数在信号发送的线程中执行。
3)Qt::QueuedConnection
当槽函数所在线程被执行时,槽函数才会被调用,槽函数在槽线程中执行。
4)Qt::UniqueConnection
不管调用多少次connect函数,信号槽只连接一次。
5)Qt::BlockingQueuedConnection
槽函数执行完毕后自动阻塞信号所在的线程。当槽函数和信号在同一个线程中时,禁止使用这个参数,不然程序崩溃。

3.传递引用

1)当信号和槽在同一个线程中
值传递会赋值对象;引用传递不会复制对象。和正常函数一致。
2)当信号和槽函数不在同一线程
第五个参数使用DirectConnection,结果和同一个线程中相同;
第五个参数使用QueuedConnection,值传递和引用传递参数没有区别,都会复制对象。

猜你喜欢

转载自blog.csdn.net/lusanshui/article/details/85293575