【发布时间】:2017-10-04 20:34:37
【问题描述】:
我知道 Qt 信号被放入事件队列,然后当事件循环看到它时,稍后调用连接的插槽。所以在调试的时候“步入”它是没有意义的。但我真的很想看看,在一个足够大的应用程序中,我无法一次记住所有内容,控制流在哪里结束。
那么有没有办法找到连接到信号的插槽,无论是基于connect(...); 调用还是实际在调试时?
在 Qt Creator 3.5.1 中(基于 Qt 5.5.1(GCC 5.2.1 20151129,64 位)):
-
Ctrl+Shift+U(查找用法)仅在源中返回emit signal();,在标头中返回void signal();。- 如果它也能返回
connect(..., SIGNAL(signal()), ..., SLOT(slot()));那就太好了,这样我就可以在slot()上的F2(转到定义)并在其中添加一个breakpoint。
- 如果它也能返回
- 纯文本搜索会返回一堆在其他类中具有相同名称的不相关信号,因此这也不是很有帮助。
【问题讨论】:
-
* Qt 信号被放入事件队列——仅用于排队连接。自动连接意味着
connect决定它是否将被排队(如果发送者和接收者在不同的线程上)并且直接导致现在从这个堆栈调用函数。 -
@AlexanderVX 我也知道这一点,但即使对于 Direct,“进入”
emit ...行实际上并没有遵循它。与“越过”相同的行为。我需要同时适用于 Queued 和 Direct 的东西,并告诉我(可能)立即或当事件循环到达它时最终会调用插槽的位置。 -
“如果它也能返回
connect(..., SIGNAL(signal()), ..., SLOT(slot()));那就太好了,这样我就可以在slot()上按 F2(转到定义)并在其中放置一个断点” the new connect syntax时可以检测到这些用法。 -
@AaronD 尝试在槽函数中放置一个断点以进行直接连接,看看这是否只是一个函数调用。
-
无关,但由于您使用的是 Qt5,因此您应该在您的
connect()调用中使用 new signal slot syntax。
标签: c++ qt debugging signals-slots