QMetaObject::Connection QObject::connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)
Qt::ConnectionType
0:Qt::AutoConnection 默认方式:信号槽在同一个线程时:1,否则为2。类型决议见注意事项。
1:Qt::DirectConnection 直接连接:槽函数立即被调用并在信号所在线程执行,会中断发出信号的函数。
2:Qt::QueuedConnection 队列连接:将槽函数调用请求放入接收者所在线程的事件队列中,并从 emit宏 返回。
3:Qt::BlockingQueuedConnection 阻塞式队列连接:将调用请求放入接收者所在线程的事件队列中,返回到emit处并阻塞信号发出者线程等待槽函数的返回,若接受者与调用者在同一线程则造成线程死锁。
4:Qt::UniqueConnection 唯一连接:与上面4种执行位或操作,表示连接只建立一次,不会重复建立。
总结:Qt::DirectConnection(同步执行): 会在emit处中断当前发射信号的函数并直接执行槽函数(在信号发送处所在线程中执行)。
Qt::QueuedConnection(异步执行):不会中断当前发射信号的函数,槽函数的执行取决于接受者所在线程事件循环的返回处理。
//信号槽使用的一些注意事项:
Qt::AutoConnection:类型1和类型2的决议是在emit宏调用时决定:若emit调用处的线程与接受者所在的线程不同则决议为:队列链接,反之则决议为直接连接。该决议与发送者所在线程无关,与emit调用所在线程和信号接受者所在线程有关。
Qt::UniqueConnection:当未使用Qt::UniqueConnection指定连接时,多次使用connect( )对同一信号槽建立连接时,这个信号会被触发多次。可以使用Qt::UniqueConnection指定只建立一次连接,这样该信号不会被触发多次,但是Qt::UniqueConnection只对成员函数起作用,不能将它使用到非成员函数的槽以及lambda表达式等。
Qt::QueuedConnection:该连接类型只适用于元对象类型。在使用该类型连接之前确保所连接的对象已经注册了元类型以及传递的参数注册了元类型,因为Qt的事件系统需要知道该类型信息,若没有注册元类型该连接不会建立,可以使用qRegisterMetaType()进行元类型注册。在使用qRegisterMetaType()之前确保该类型使用Q_DECLARE_METATYPE()进行声明。(使用属性API时也需要qRegisterMetaType()注册)。
注:本文是工作学习笔记。若有错误,恳请指正。