记录排队的连接

Logging queued connections

我正在使用 Qt 5.4 构建的复杂状态引擎系统(使用自定义状态引擎 类)。

该代码的一部分是记录事件、转换等。记录 所有 对象收到的 engine/state 事件对我来说非常重要,这样我就可以完全跟踪状态引擎中发生的事情。

对于大多数事件类型,日志记录很容易。但是我未能记录排队的连接(即元调用事件)。 QMetaCallEvent 是私有的,所以我无能为力。然而,很难相信 Qt 的这样一个不可或缺的部分不能被正确检查。

我是否错过了一些允许记录排队连接的方法(包括信号名称、插槽名称、发送方名称、接收方名称和参数(如果可能))?

安装事件过滤器并使用 ev->type() == QEvent::MetaCall 拦截事件。所有成员在调试器中可见。

需要访问私有 headers?在您的 .pro 文件中使用 QT += core-private。

(tone mode="original poster")很难相信没有人阅读文档(/tone)

没有官方 API 允许按照我的意图进行。

检查 QMetaCall 事件(使用私有框架 headers)不是一个好主意。首先,它们是私有的(并且可能随时破坏您的代码)其次,如果立即删除发件人,QMetaCall 事件 sender() 指针可能无效,在这种情况下我找不到检查事件的干净方法。

我现在使用的方式完全不同。我没有检查到达的事件 objects,而是使用 QSignalSpy 的修改变体,它允许做比原始 class 更多的事情,并帮助使用辅助连接记录信号发射。

在我的情况下,这似乎是可行的,即使它非常复杂并且不是通用解决方案。至少不涉及私人headers。