通过直接连接或排队连接调用插槽的 QTimer 超时插槽有什么区别?

What is difference between QTimer timeout slot calling a slot through direct connection or queued connection?

我问的是事件引擎中有很多 qt 事件排队的情况。 QTimer 是否会通过事件发出 timeout() 信号,并会与 queuedConnection 一起创建另一个事件?

当 QTimer 超时时,将此 QTimer 的信号与一个槽连接的每个信号槽连接都恰好触发该槽一次。

QTimer发出QTimer::timeout信号时,与Qt::DirectConnection连接的槽将被立即调用。如果您使用排队连接,它将安排一个事件来调用插槽,该事件将由事件循环处理。 QTimer 使用 timerEvent to emit the timeout signal.

不,默认情况下它不排队连接,除非它是 运行 在不同的线程中。因此它是 DirectConnection。

我想说的是,一般来说,如果你想保证事件的顺序,你最好将 Qt::QueuedConnection 与计时器之类的东西一起使用,即使在同一个线程中也是如此,这样事件就会进入排队并且不只是立即采取行动 - 因为这种行为有点像 "interrupt".

但是,如果您真的希望定时器 timeout() 立即生效,那么请使用 Qt::DirectConnection - 我觉得您通常需要更加小心这种连接类型(定时器之类的东西可以在其他正常代码中间触发)。

编辑

"normal code" 我的意思是......好吧,请看下面的评论: