跟随发出的信号到其连接的插槽?

Posted

技术标签:

【中文标题】跟随发出的信号到其连接的插槽?【英文标题】:Follow an emitted signal to its connected slot(s)? 【发布时间】: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。 【参考方案1】:

你可以使用New Signal Slot Syntax:

connect(sender, &Sender::valueChanged,receiver, &Receiver::updateValue);

通过这个连接你可以找到用法,Qt会找到连接线。

【讨论】:

以上是关于跟随发出的信号到其连接的插槽?的主要内容,如果未能解决你的问题,请参考以下文章

pyqt4在线程中向主线程中的插槽发出信号

QNetworkReply::error 信号何时会跟随finished() 信号?

信号没有被其他类捕获

QNetworkAccessManager 不发出完成信号

Qt - 仅在发出两个信号时才调用插槽

Qt 插槽同时断开连接并从不同线程调用