相信大多数面试过Qt的同学都会被问的问题,是的,因为在Qt的世界中,这简直太太太基础啦,而你只知道Qt::AutoConnection,从未关心过其他连接方式,如果被我说中了,那就耐心看完吧!
Qt::AutoConnection 自动连接
这是QObject::connect默认的连接方式,简单粗暴,一般情况也不会出问题,因为Qt都帮你搞定了。搞定了什么东西呢?
如果信号的接收者和信号的发送者在同一个线程,那么Qt::DirectConnection会被使用;否则,Qt::QueuedConnection会被使用。连接方式会在信号发出时决定。
Qt::DirectConnection 直连
信号发出后,槽函数会在信号发送线程中立即执行。这种方式不能保证线程安全,要谨慎使用,要使用就要有把握。
Qt::QueuedConnection 队列连接
槽函数在控制权返回到接收者线程的事件循环时调用。槽函数在接收者线程中执行。
Qt::BlockingQueuedConnection 阻塞队列连接
类似Qt::QueuedConnection,不同点在于信号发送线程会一直阻塞,直到槽函数执行完成并返回。如果信号发送者和槽函数接收者在相同的线程中,不能使用这种连接方式,否则会造成死锁。
Qt::UniqueConnection 唯一连接
它与上面的连接方式组合使用,通过或(||)进行组合。使用何种连接方式,保证信号槽连接的唯一性,如果已经连接过,QObject::connet将返回false。
Qt::SingleShotConnection 单发连接
它与上面的连接方式组合使用,通过或(||)进行组合。使用何种连接方式,信号只会被调用一次,然后,连接将会自动断开。