【问题标题】:Logging queued connections记录排队的连接
【发布时间】:2015-02-17 15:42:22
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: qt logging signals-slots qevent queued-connection


    【解决方案1】:

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

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

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

    【讨论】:

    • 好吧,我阅读了文档。也许您可以提供一个链接,其中记录了 QMetaCallEvent 详细信息?或者也许是“核心私有”文档的链接?
    【解决方案2】:

    没有官方的 API 可以做我想做的事。

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-14
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多