qt - 临时阻塞两个 QObject 之间的信号

标签 qt signals qobject slot

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

QObject::blockSignals(bool) , 但只在两个 QObjects 之间起作用.

也就是执行下面的SignalBlocker::blockSignals(bool)功能:

class SignalBlocker {

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

private:
  QObject *mSender, *mReceiver;
}

可以通过断开和重新连接对象来实现,但首先必须存储信号/插槽列表。
自省(introspection)方法似乎不够强大,无法实现这一点(我查看了 QMetaObjectQSignalSpy 没有成功)。

最佳答案

QT 无法仅禁用信号槽对。试试这个解决方法:

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;
};

关于qt - 临时阻塞两个 QObject 之间的信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15633086/

相关文章:

c++ - QMediaPlayer 在 Ubuntu 16.04/Qt 5.6 上不播放任何内容

qt - 在 Ubuntu/Debian 上哪里安装基于 Qt 的应用程序的文件

c - 获取是否收到信号

c++ - 计时器和 pthreads (POSIX)

qt - 如何使用 QObject 派生类实例遵循 OOP 基本概念?

qt - 获取在应用程序中创建的所有 QObject 的列表

c++ - 具有独立布局的嵌套 Qt 小部件

C++ 模板类对于不同的编译器表现不同

c++ - 多线程定时器类

c++ - QThread 和 QWidget 的多重继承( Multiple inheritance with QObject )