C++ Qt中的事件队列

C++ Qt中的事件队列,c++,qt,events,C++,Qt,Events,Qt应用程序中有多少个事件队列?单击等事件将排入队列。您还可以使用postEvent之类的函数生成事件。所有这些事件都在同一队列中吗?如果是,是否有方法定义不同的队列?通常,每个线程最多有一个事件队列 可以有额外的事件队列,两种实现策略在是否与QCoreApplication::postEvent保持兼容方面有所不同 如果您不关心处理队列的QCoreApplication::postEvent,一切都取决于您。您可以以任何方式实现队列。注意,Qt没有实现将QObject标记为属于特定事件队列的方

Qt应用程序中有多少个事件队列?单击等事件将排入队列。您还可以使用postEvent之类的函数生成事件。所有这些事件都在同一队列中吗?如果是,是否有方法定义不同的队列?

通常,每个线程最多有一个事件队列

可以有额外的事件队列,两种实现策略在是否与
QCoreApplication::postEvent
保持兼容方面有所不同

如果您不关心处理队列的
QCoreApplication::postEvent
,一切都取决于您。您可以以任何方式实现队列。注意,Qt没有实现将
QObject
标记为属于特定事件队列的方法。当您准备从队列中传递事件时,只需调用
QCoreApplication::notify
,将目标对象指针和事件指针传递给它。小菜一碟当然,您无法控制从默认队列传递到任何和所有对象的事件

另一种方法是与
QCoreApplication::postEvent
保持兼容。也就是说,您以某种方式将对象“标记”为其事件由您的队列处理。您截获将要传递给目标的事件,将其排队,并根据需要自行处理

这是一种类似于计算机的黑客行为。这很好。而且很糟糕。以及介于两者之间的事情。这是值得知道它是如何做到的,为什么

分层状态机通常需要控制事件的传递,并在其他事件之前将自己的事件注入队列。这使得状态转换事件按照与导致转换的事件相关的正确顺序交付;此外,有时导致转换的事件可能需要多次传递,保留以供以后传递,等等

这一切都与默认事件调度系统强制执行的严格事件生存期背道而驰。为了解决这个问题,
QStateMachine
实现了自己的事件队列。每当您在将要传递给某个对象的事件上声明转换时,状态机就会将自身安装为该对象上的事件筛选器

然后,无论何时原始事件到达目标对象,过滤器都会截获该事件并阻止其传递到目标对象。现在,它必须复制事件,并将其插入自己的队列中。必须进行复制,因为一旦控件离开事件筛选器和/或目标对象的
event()
方法,事件调度器就会删除该事件

不幸的是,
QEvent
s是不可克隆的——至少不是公开克隆的。有一些,但它是一个私有API,不基于虚拟复制构造函数习惯用法


使用基于过滤器的习惯用法/hack,您可以实现属于某个事件队列的
QObject
的概念。当您的队列过滤目标对象上的事件、克隆它们并将它们排队以进行单独传递时,该对象在功能上驻留在您的事件队列中。如果未进行此类筛选,则对象驻留在默认的每线程队列中。您也只能截获队列感兴趣的类型的事件,就像
QStateMachine
一样。

您运行的每个事件循环都有一个事件队列。因此答案取决于您的应用程序——您是否使用
QThread
,启动非QThread线程并手动启动
QEventLoop
,等等?为什么您认为需要在同一线程中有多个事件队列?你想达到什么目标?在绝大多数情况下,您根本不需要额外的队列。默认队列是按优先级排序的,并且支持通过私有接口进行事件压缩,因此,如果您只需要高优先级或可压缩事件,那么您已经获得了它们。请描述使您相信需要多个/非默认事件队列的场景。如果您不告诉我们您想解决什么问题,我们就无法告诉您这样的队列是否是一种解决方案。