如何监控QT信号?

Ron*_*nen 6 c++ qt visual-studio

在调试期间,我想看看等待我的程序的事件循环.它可能已经泛滥,我希望看到什么信号,没有(手动)向每个Q_EMIT添加特定的日志消息.

可能的解决方案可能是看一些包含事件队列的内部qt数据结构(有这样的事情吗?怎么样?)

要么 -

为每个发出的信号写一条日志信息(这可能吗?).

还有其他想法吗?

(Windows上的QT 4.8,使用visual studio 2012)

Rei*_*ica 5

信号和事件是彼此没有任何关系的两件事。

我想看看我的程序的事件循环有什么在等待。应该是被淹了

首先,让我们弄清楚术语:

  • 事件队列是事件在交付之前存储的地方;
  • 事件循环负责排空事件队列并将事件传递到QObjects
  • 平均而言,当每个事件的传递期间有多个事件添加到队列中时,就会发生事件泛滥

事件队列可能被淹没的原因有两个:

  1. 处理某些事件需要太长时间(例如,当您的代码阻塞时):由于计时,队列的排出率低于填充率。
  2. 您为每个交付的事件添加多个事件(平均而言):由于事件倍增,队列的填充率高于耗尽率 - 这与任何计时完全无关。一个恰当的名字就是事件风暴

要检测代码块时间过长,您可以使用我为另一个答案编写的工具

要了解有多少事件正在等待任何给定线程,请使用未记录的qGlobalPostedEventsCount(). 您可以将其添加到上面链接的工具的代码中。


Mat*_*rew 1

不确定这对您来说是否足够,但您可以尝试在实现 eventFilter() 的 QObject 之间安装事件过滤器,如下所示:

class MyWidget : public QWidget
{
    QGraphicsView myView;
    MyWidget()
    {
        myView->installEventFilter(this);
        // incoming events to myView are shown on the standard output
    }
};
Run Code Online (Sandbox Code Playgroud)

通过阅读文档,您可以变得更有创意。