信号与槽的连接函数的原型
bool QObject::connect (const QObject * sender,
const char * signal,
const QObject * receiver,
const char * method,
Qt::ConnectionType type = Qt::AutoConnection)
其中第5个参数决定信号与槽的连接方式,用于决定槽函数被调用时的相关行为。
Qt::AutoConnection 默认连接
Qt::DirectConnection 槽函数立即调用
Qt::BlockingQueuedConnection 同步调用
Qt::QueuedConnection 异步调用
Qt::UniqueConnection 单一连接
(1) Qt::DirectConnection(立即调用)
直接在发送信号的线程中调用槽函数(无论发送信号和槽函数是否位于同一线程),等价于槽函数的实时调用。
也就是说槽函数在发送信号所在线程调用。直接连接,其实就等同于直接调用。
(2) Qt::QueuedConnection(异步调用)
信号发送至目标线程的事件队列(发送信号和槽函数位于不同线程),交由目标线程处理,当前线程继续向下执行。
当信号发送时候,槽函数不会直接调用,直到接受者线程取得控制权时进行事件处理循环时候,槽函数才会调用执行。
跨线程时只有队列连接是安全的,队列连接借助的是事件系统,所以你可以通过postEvent在线程间传递数据。
(3) Qt::BlockingQueuedConnection(同步调用)
信号发送至目标线程的事件队列,由目标线程处理。当前线程阻塞等待槽函数的返回,之后向下执行。
Qt::BlockingQueuedConnection 和QueuedConnectionx相同,但是sender发送后线程会进入阻塞状态,
只有receiver线程执行槽函数完成,才会结束阻塞状态,所以这种参数类型设定情况下,sender和receiver不能在同一个线程,否则会造成死锁发生。
(4) Qt::AutoConnection(默认连接)
当发送信号线程=槽函数线程时,效果等价于Qt::DirectConnection;
当发送信号线程!=槽函数线程时,效果等价于Qt::QueuedConnection。
Qt::AutoConnection是connect()函数第5个参数的默认值,也是实际开发中字常用的连接方式。
(5) Qt::UniqueConnection(单一连接)
功能和AutoConnection相同,同样能自动确定连接类型,但是加了限制:同一个信号和同一个槽函数之间只能有一个连接。
注意:如果槽函数工作在receiver线程(不和sender在同一个线程),并且槽函数中有耗时操作,
比如while循环等,这个时候sender在发送信号,槽函数是不会响应的,除非槽函数工作在sender线程中,也就是要把参数设置为DirectConnection或者槽函数所在线程开启事件循环。