首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >暂时阻止两个QObjects之间的信号

暂时阻止两个QObjects之间的信号
EN

Stack Overflow用户
提问于 2013-03-26 17:08:10
回答 3查看 12.1K关注 0票数 5

我想一般地暂时阻止两个QObjects之间的信号,而不修改其他信号/插槽行为,也不知道它们的上下文。

类似于QObject::blockSignals(bool),但仅在两个QObjects之间起作用。

即实现如下SignalBlocker::blockSignals(bool)函数:

代码语言:javascript
复制
class SignalBlocker {

public:
  SignalBlocker(QObject *sender, QObject *receiver) :
    mSender(sender), mReceiver(receiver) {}
  void blockSignals(bool block);

private:
  QObject *mSender, *mReceiver;
}

通过分离和重新连接对象是可能的,但首先必须存储信号/时隙的列表。内省方法似乎还不够强大,无法实现这一点(我研究了QMetaObjectQSignalSpy,但没有成功)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-22 20:28:56

QT没有仅禁用信号插槽对的功能。尝试此解决方法:

代码语言:javascript
复制
struct SignalDisabler
{
    SignalDisabler(const QObject *sender, const char *signal, const QObject *receiver, const char *member)
        : sender(sender)
        , signal(signal)
        , receiver(receiver)
        , member(member)
    {
        QObject::disconnect(sender, signal, receiver, member);
    }

    ~SignalDisabler()
    {
        QObject::connect(sender, signal, receiver, member);
    }

    const QObject *sender;
    const char *signal;
    const QObject *receiver;
    const char *member;
};
票数 11
EN

Stack Overflow用户

发布于 2013-03-27 00:32:50

由于您希望发送方和接收方不在该作用域内发送信号,因此我将尝试使用blockSignals(bool)

代码语言:javascript
复制
class SignalBlocker{
public:
SignalBlocker(QObject* obj)
{
   _o = obj;
   _o->blockSignals(true);
}
~SignalBlocker()
{
   _o->blockSignals(false);
}
private:
   QObject* _o;
};

现在只需使用

代码语言:javascript
复制
SignalBlocker sb1(sender);
SignalBlocker sb2(reciever);
//...
票数 3
EN

Stack Overflow用户

发布于 2013-03-26 18:16:18

您可以使用disconnect(sender, 0, receiver, 0);断开所有sender信号与所有receiver插槽的连接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15633086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档