1

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

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

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

有没有我错过的方法可以记录排队的连接(包括信号名称、插槽名称、发送方名称、接收方名称和参数,如果可能的话)?

4

2 回答 2

0

没有允许做我想做的事情的官方 API。

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

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

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

于 2015-02-21T13:40:43.713 回答
0

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

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

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

于 2015-02-17T22:15:33.663 回答