作者:a58224227 | 来源:互联网 | 2023-05-17 18:07
Qt 需要查看信号发出的线程是不是与接受者所在线程一致,来决定连接类型。注意,Qt 检查的是信号发出的线程(即,信号在哪个Thread中emit的,)
class
Thread
:
public
QThread
{
Q_OBJECT
signals
:
void
aSignal
(
)
;
protected
:
void
run
(
)
{
emitaSignal();//在子线程中emit,发出信号
}
}
;
/* ... */
Thread
thread
;
Object
obj
;
QObject
::
connect
(
&thread
,
SIGNAL
(
aSignal
(
)
)
,
&obj
,
SLOT
(
aSlot
(
)
)
)
;
thread
.
start
(
)
;
aSignal()
信号在一个新的线程被发出(就是Thread
线程)。注意,因为这个线程Thread,并不是Object
所在的线程(Object
所在的线程是主线程),所以这里将会使用队列连接。
跨线程的信号槽也是类似的。当我们将信号与槽连接起来时,QObject::connect()
的最后一个参数将指定连接类型:
Qt::DirectConnection
:直接连接意味着槽函数将在信号发出的线程直接调用
Qt::QueuedConnection
:队列连接意味着向接受者所在线程发送一个事件,该线程的事件循环将获得这个事件,然后之后的某个时刻调用槽函数
Qt::BlockingQueuedConnection
:阻塞的队列连接就像队列连接,但是发送者线程将会阻塞,直到接受者所在线程的事件循环获得这个事件,槽函数被调用之后,函数才会返回
Qt::AutoConnection
:自动连接(默认)意味着如果接受者所在线程就是当前线程,则使用直接连接;否则将使用队列连接