Qt信号和槽的连接方式

enum Qt::ConnectionType
描述可在信号和槽之间使用的连接类型。特别地,它确定一个特定的信号是立即传递给槽还是排队等待稍后传送。

Constant

Value

Description

Qt::AutoConnection

0

默认方式,如果接收者位于发出信号的线程中,则使用Qt::DirectConnection。否则,将使用Qt::QueuedConnection。连接类型在发出信号时确定。

Qt::DirectConnection

1

当发出信号时,将立即调用槽函数。槽函数在发送信号的线程中执行。

Qt::QueuedConnection

2

当控制权返回到接收者线程的事件循环时,将调用槽函数。槽函数在接收者的线程中执行。

Qt::BlockingQueuedConnection

3

与Qt::QueuedConnection相同,不同点是发送信号以后发送者线程会阻塞,直到槽函数执行返回。如果发送者和接收者在同一个线程中,则不能使用此连接,否则应用程序将死锁。注意:使用此类型连接同一线程中的对象将导致死锁。

Qt::UniqueConnection

0x80

此标志可以与上述任何一种连接类型结合使用(使用按位或)。使用此标志时连接方式与Qt::AutoConnection相同。设置Qt::UniqueConnection时,如果连接已存在(即,如果同一信号已连接到同一对对象的同一个槽),则QObject::connect()返回false,连接操作将会失败。

对于队列连接,参数必须是Qt的元对象系统已知的类型,因为Qt需要复制参数以将它们存储在幕后的事件中。如果尝试使用队列连接时收到错误消息:

QObject::connect: Cannot queue arguments of type 'MyType'

在建立连接之前,调用qRegisterMetaType()注册数据类型。

实际应用中遇到过发送一次信号,槽函数多次触发的情况,原因是多次执行了connect()连接函数,连接几次信号和槽,发送信号时槽函数就会执行几次,所以不想多次触发槽函数的话就要记得disconnect(),或者使用Qt::UniqueConnection避免重复连接信号和槽。

Qt::UniqueConnection可以和其他方式混合使用,使用方式:static_cast< Qt::ConnectionType>(Qt::QueuedConnection | Qt::UniqueConnection)

注意:Qt::UniqueConnection只能用于连接成员函数,不能用于lambda表达式,非成员函数和仿函数。