Qt 信号槽的连接方式

少于 1 分钟阅读

官网解释

Qt::ConnectionType

跨线程的信号和槽 Qt支持这些信号槽的连接方式:

  1. Auto Connection(默认): 假如信号在一个接收者的线程中发射,则行为等同于 Direct Connect. 否则行为等同于Queued Connection.
  2. Direct Connect: 当信号被发射,槽函数将会被立即调用。槽函数将会在发射者的线程中执行, 而不一定在接收者线程中执行。
  3. Queued Connect: 槽函数在控制权返回到接收者线程的事件循环时被调用。槽函数在接收者线程中被执行。
  4. Blocking Queued Connection: 槽函数除了阻塞当前线程直到槽函数返回,其他像Queued Connection一样被调用。备注:在同一线程中使用这个类型的connect会导致死锁。
  5. Unique Connect: 这个行为等同于Auto Connection,但是这个connection是只能在现有连接不重复的情况下生效。假如相同的信号已经连接到相同的槽函数中,这个连接不会建立且connect()返回false
  • 连接的类型可以通过connect()额外的参数指定,注意:在发送者和接收者在不同线程中使用direct connect是不安全的。如同一个事件循环在接收者的线程中,在另一个线程中调用存活对象的任何函数是不安全的。
  • QObject::connect() 它本身是线程安全的。

在使用Queue Connection的时候,参数必须是Qt 元对象系统已知的类型,因为Qt需要拷贝入参并保存在事件背后的场景。假如你使用Queue Connection并得到以下错误信息:

QObject::connect: Cannot queue arguments of type ‘MyType’

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

标签:

分类:

更新时间: