我使用Qt 5.4构建的复杂状态引擎系统(使用自定义状态引擎类)。
该代码的一部分是记录事件、转换等。对我来说,记录引擎/状态对象正在接收的所有事件非常重要,这样我就可以完全跟踪状态引擎中发生的事情。
对于大多数事件类型,日志记录很容易。但是,我未能记录排队的连接(即元调用事件)。QMetaCallEvent是私有的,所以我没什么可做的。然而,很难相信Qt的这样一个组成部分不能被正确检查。
我是否错过了允许记录排队连接的方法(包括信号名称、插槽名称、发送方名称、接收方名称和参数(如果可能))?
安装事件过滤器并使用ev->type()==QEvent::MetaCall拦截事件。调试器中可见的所有成员。
需要访问专用标头吗?在.pro文件中使用QT+=核心私有。
(tone mode="原始海报")很难相信没有人阅读文档(/tone)
没有官方的API允许做我想要做的事情。
检查QMetaCall事件(使用私有框架头)是个坏主意。首先,它们是私有的(并且可能随时破坏您的代码);其次,如果发送方被立即删除,QMetaCall事件sender()指针可能无效,并且在这种情况下我找不到检查事件的干净方法。
我现在的使用方式完全不同了。我使用的不是检查到达的事件对象,而是QSignalSpy的一个修改变体,它允许做比原始类更多的事情,并有助于使用二次连接记录信号发射。
在我的情况下,这似乎是可行的,即使它非常复杂,而且不是一个普遍的解决方案。至少不涉及私有标头。