Qt: 阻止QObject接收信号

3
有没有一种方法可以让一个暂时忽略所有传入的信号?
我知道存在一个“”,如果设置为true,则会阻止发送信号。
我希望实现相反的功能,即使事件队列不排队,或者如果它在阻止插槽的同时忽略调用插槽时,则简单地不排队。
换句话说,我正在寻求“”。

2
如果您需要这样的解决方案,那么意味着您的设计有问题。您可以在类中引入一个 bool disableSlotsFlag 并在每个槽中进行检查。另一种方法是断开所有槽并在必要时重新连接。顺便说一下,您可以在这里找到很多有用的代码。 - Dmitry Sazonov
@Kamran,如果你的最终目标是停止队列处理中的插槽...那么发出信号的用途是什么!!只需阻止信号...在插槽内部进行变通是一种不好的做法!是的,这是糟糕的设计。 - Mohammad Kanan
1个回答

3

据我所知,QObject没有内置的方法可以(暂时)关闭接收/处理信号。

最简单的实现方式可能是直接在相关函数中实现检查和忽略功能:

void doStuff()
{
    if (ignoreSignals)
        return;
    // Actual functionality here...
}

如果您无法更改代码,您可以考虑断开与相关信号插槽函数(或整个对象)的连接,并稍后重新连接。

另外,您可以实现一个“过滤器”对象,其他对象连接到该对象(而不是直接连接到原始对象),并且实现前面提到的检查和忽略功能,仅在过滤器未激活时转发(即发射)信号。


为了进一步完善“过滤器”建议,实现的一种方法是将原始的 QObject 连接到一个继承自 QObject代理 对象上,并且其角色是传递信号。要切换信号的开关,只需调用 QObject::blockSignals() 即可。 - RAM
1
这是我目前决定处理事情的方式,但是每次都需要在对象及其子对象的每个插槽中添加此标志会变得很烦人。 - Kamran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接