如何监测 QT 信号?

Posted

技术标签:

【中文标题】如何监测 QT 信号?【英文标题】:How to monitor QT signals? 【发布时间】:2015-10-01 07:06:31 【问题描述】:

在调试期间,我想看看有什么在等待我的程序的事件循环。 它可能被淹没了,我想看看是什么信号,而不是(手动)向每个 Q_EMIT 添加特定的日志消息。

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

或者-

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

还有其他想法吗?

(Windows 上的 QT 4.8,使用 Visual Studio 2012)

【问题讨论】:

您要监控信号或事件吗? 我要监听信号。 也许这会有所帮助:doc.qt.io/qt-5/qsignalspy.html ? 谢谢!但如果我理解正确的话,QSignalSpy 是特定于对象的(并且是特定于信号的)。我有这么多的对象会发出这么多的信号,我讨厌手动操作。 @Ronen,您可能想研究这种方法:levelfour.googlecode.com/svn/branches/dev/vd2/GCF/source/… 【参考方案1】:

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

我想看看等待我的程序的事件循环的是什么。它可能被淹了。

首先,让我们弄清楚命名法:

事件队列是存储事件直到交付的地方; 一个事件循环是什么耗尽事件队列并将事件传递给QObjects事件泛滥发生在平均而言,在每个事件的传递期间有多个事件添加到队列中。

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

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

要检测代码块时间过长,可以使用a tool I wrote for another answer。

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

【讨论】:

【参考方案2】:

不确定这对您是否足够,但您可以尝试在实现 eventFilter() 的 QObject 之间安装 event filters,如下所示:

class MyWidget : public QWidget

    QGraphicsView myView;
    MyWidget()
    
        myView->installEventFilter(this);
        // incoming events to myView are shown on the standard output
    
;

您可以通过阅读文档获得更多创意。

【讨论】:

谢谢,但我不想成为特定对象。我想查看我所有的信号,我必须手动执行许多对象。 如果您在 QCoreApplication 或 QApplication 对象上安装事件过滤器,而不是在此处显示的 QGraphicsView,则可以获取所有事件。【参考方案3】:

Events and Filters 的 Qt 文档指出:

还可以通过在QApplicationQCoreApplication 对象上安装事件过滤器来过滤整个应用程序的所有事件。此类全局事件过滤器在特定于对象的过滤器之前调用。这非常强大,但它也会减慢整个应用程序中每个事件的事件传递速度。

因此,您可以在 QApplication 或 QCoreApplication 上创建事件过滤器并监视所有事件,检查它们的type

或者,QCoreApplication 使用虚拟notify 函数将事件传递给对象。覆盖QCoreApplication 将允许您查看事件最初* 将传递到的事件和QObject。

*请注意,如果接收对象忽略事件,则事件会传播到父对象。

如果您选择使用notify,请注意此功能的未来方向:

未来方向:在 Qt 6 中,将不会为存在于主线程之外的对象调用此函数。需要该功能的应用程序应同时寻找其他解决方案来满足其事件检查需求。更改可能会扩展到主线程,导致此功能被弃用

【讨论】:

以上是关于如何监测 QT 信号?的主要内容,如果未能解决你的问题,请参考以下文章

Qt信号槽如何附带自定义参数

Qt for Qt:如何连接到具有新信号/插槽风格的信号?

QT 信号和槽式如何实现的

Pyside (Qt) - 如何查询信号

qt中c语言函数发送qt信号

Qt信号槽原理(调用)