Qt 信号槽

Qt connect 函数的连接方式

  1. Qt::AutoConnection: 默认值,使用这个值则连接类型会在信号发送时决定。如果接收者和发送者在同一个线程,则自动使用Qt::DirectConnection类型。如果接收者和发送者不在一个线程,则自动使用Qt::QueuedConnection类型。

  2. Qt::DirectConnection:槽函数会在信号发送的时候直接被调用,槽函数和信号发送者在同一线程。效果看上去就像是直接在信号发送位置调用了槽函数,效果上看起来像函数调用,同步执行。 emit语句后面的代码将在与信号关联的所有槽函数执行完毕后才被执行。

  3. Qt::QueuedConnection:信号发出后,信号会暂时被放到一个消息队列中,需等到接收对象所属线程的事件循环取得控制权时才取得该信号,然后执行和信号关联的槽函数,这种方式既可以在同一线程内传递消息也可以跨线程操作。 emit语句后的代码将在发出信号后立即被执行,无需等待槽函数执行完毕

  4. Qt::BlockingQueuedConnection:发送者线程会阻塞,直到接收者线程执行完槽函数才返回.它既像 QueuedConnection(跨线程通过事件队列传递),又像 DirectConnection(调用必须完成才能继续).而且接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。

+ Qt::BlockingQueuedConnection: 接收者和发送者不能在一个线程
  1. 发送者发射信号 → 阻塞等待接收者执行槽函数。
  2. 但接收者槽函数需要事件循环调度才能运行,而事件循环此时被阻塞,导致永远无法执行。
  3. 结果就是死锁。
  1. Qt::UniqueConnection:避免重复连接同一个信号和槽。