【发布时间】:2011-02-01 16:55:47
【问题描述】:
我刚刚在 Qt 4.6 中发现了队列连接的有趣行为:
建立第一个排队的连接:
connect(someSender, SIGNAL(completed()), this, SLOT(handleCompletion()), Qt::QueuedConnection)
然后 someSender 发送信号:
emit completed()
在接收信号之前(因为它在队列中),我断开信号:
disconnect(someSender, SIGNAL(completed()), this, SLOT(handleCompletion())
不过,handleCompletion 槽会在下一次 eventloop 迭代时被调用。我可以通过在正确的位置使用 someSender->blockSignals(true) 来防止这种情况发生,但更不用说使用一些布尔标志来禁用插槽的功能了。
尤其令我感到惊讶的是,Qt 文档中没有提到这种行为(至少我还没有找到)。
最后一个问题:有什么明智的方法可以避免这种情况发生?
【问题讨论】:
-
我猜 Qt::QueuedConnection 的实现方式是接收端的队列(事件循环),因此在 disconnect() 之前发出的所有内容都应该进入该队列并留在那里直到它被处理。可能您想调用 disconnect() 与信号发射同步。在其他情况下,是否处理该信号没有太大区别,因为 handleCompletion() 可以更早地完成较早的事件,并且在您预期的场景中完成了()将被处理。 IE。如果您没有指定线程交互的直接场景,您的程序可以按照它想要的方式工作。
-
如果你愿意,你可以去破解 Qt 代码,它写得很好。
标签: qt