Connect 第5个参数讲解
connect函数原型如下:
inline QMetaObject::Connection QObject::connect(const QObject *asender, const char *asignal,const char *amember, Qt::ConnectionType atype) const
{ return connect(asender, asignal, this, amember, atype); }
第5个参数类型为Qt命名空间的ConnectionType枚举类型。该枚举描述信号和槽之间可以使用的连接类型。atype的值决定特定信号是立即传递给槽函数还是排队等待一会儿传递给槽函数。ConnectionType枚举定义如下:
enum ConnectionType {
AutoConnection,
DirectConnection,
QueuedConnection,
BlockingQueuedConnection,
UniqueConnection = 0x80
};
ConnectionType枚举值功能介绍:
Constant | Value | Description |
---|---|---|
Qt::AutoConnection | 0 | (默认值)如果信号不是与接收对象同一线程发出的,视为Qt::QueuedConnection,把信号做排队处理。否则,视为Qt::DirectConnection,直接调用槽函数。绑定类型在信号发出时决定 |
Qt::QueuedConnection | 2 | 当控制返回到接收者线程的事件循环时调用该类型的槽函数。槽函数在接收者线程中执行。 |
Qt::BlockingQueuedConnection | 4 | 与Qt::QueuedConnection绑定方式相同,除了当前线程阻塞直到插槽返回。这种连接类型只能在发送者和接收者不是同一线程的情况下使用。注意:违反此规则可能导致应用程序死锁。 |
Qt::UniqueConnection | 0x80 | 与Qt::AutoConnection相同,但只有当它不复制现有连接时才会建立连接。也就是说,如果对于同一对对象相同的信号已经连接到相同的槽,那么连接将失败。这种连接类型是在Qt 4.6中引入的 |
Qt::AutoCompatConnection | 3 | 启用Qt 3支持时的默认类型。与AutoConnection相同,但在某些情况下也会导致警告输出。更多信息请参见兼容性信号和槽位 |
对于排队连接,参数必须是Qt的元对象系统所知道的类型,因为Qt需要复制参数以将它们存储在后台的事件中。如果使用排队连接报错如下:
QObject::connect: Cannot queue arguments of type 'MyType'
在建立连接之前,调用qRegisterMetaType()来注册数据类型。当使用多线程的信号和槽时,请参见Signals and Slots Across Threads。参见Qt中的Tread Support,QObject::connect(), qRegisterMetaType()和Q_DECLARE_METATYPE()。
注:上述信息源自Qt帮助文档。