在调试过程中,我想看看我的程序事件循环等待什么。它可能被淹没了,我想知道是哪些信号引起的,而不必(手动)添加特定的日志消息到每个Q_EMIT。可能的解决方案是观察一些包含事件队列的内部Qt数据结构(是否有这样的东西?如何实现?),或者为每个发射的信号编写日志消息(是否可行?)。还有其他的想法吗?(QT 4.8 在 Windows 上,使用 Visual Studio 2012)
信号和事件是两个完全不相关的事情。
我想看看我的程序事件循环中等待什么。它可能被淹没了。
首先,让我们搞清楚术语:
QObjects
的东西,只有两个原因可能导致事件队列被淹没:
如果要检测代码块是否过长,您可以使用我为另一个答案编写的工具。
要知道任何给定线程正在等待多少事件,请使用未记录的qGlobalPostedEventsCount()
。将其添加到上面链接的工具的代码中。
我不确定这对你是否足够,但你可以尝试在实现eventFilter()的QObjects之间安装event filters来达到目的。
class MyWidget : public QWidget
{
QGraphicsView myView;
MyWidget()
{
myView->installEventFilter(this);
// incoming events to myView are shown on the standard output
}
};
QApplication
或QCoreApplication
对象上安装事件过滤器,以过滤整个应用程序的所有事件。这种全局事件过滤器会在特定于对象的过滤器之前被调用。它非常强大,但也会减慢整个应用程序中每个单独事件的传递速度。type
。QCoreApplication
使用虚拟notify
函数将事件传递给对象。重写QCoreApplication
将允许您查看事件和最初*将传递给的QObject。notify
,请注意此函数的未来方向:
未来方向:在Qt 6中,不会为生存在主线程之外的对象调用此函数。需要该功能的应用程序应在此期间寻找其他解决方案以满足其事件检查需求。该更改可能会扩展到主线程,导致此函数被弃用。
QEventLoop
来运行自己的事件循环,而不是应用程序的事件循环,并且可以进行调试! - Dmitry Sazonov