运行 一个函数取决于多个信号

Running a function depending upon multiple signals

我有两个不一定同时收到的信号。

第一个信号

第一个信号由 MyClass 发出并由 MyClass:

的插槽处理
QObject::connect(this, &MyClass::ready, 
                 this, &MyClass::handleReady);

void MyClass::handleReady()
{
    qDebug() << "Ready to do next step";
}

// ... somewhere in MyClass implementation, signal is emitted:
emit ready();

第二个信号

第二个信号由成员对象发出,并由 MyClass:

的插槽处理
QObject::connect(m_member, &MemberClass::enabledChanged, 
                 this,     &MyClass::handleEnabledChange);
//...
void MyClass::handleEnabledChange(const bool enabled)
{
    qDebug() << "Is member enabled?" << enabled;
}

我打算 运行 一些代码(如函数),这取决于两个条件:

  1. 收到第一个信号,即ready
  2. 接收到第二个信号,即enabledChanged,其布尔参数为true

我不知道如何检查是否满足上述条件。

更新

现在我的信号数增加到三个。所以我的代码执行取决于三个条件。

在 MyClass 中编写一个方法来检查两个条件是否都为真,并在两个槽中调用该方法。使条件成员成为 myClass

bool MyClass::areBothConditionsTrue() {
    if(m_conditionA && m_conditionB)
        return true:
    return false;
}

void MyClass::handleReady()
{
    qDebug() << "Ready to do next step";
    m_conditionA = true;
    bool b = areBothConditionsTrue();
}

void MyClass::handleEnabledChange(const bool enabled)
{
    qDebug() << "Is member enabled?" << enabled;
    m_conditionB = enabled;
    bool b = areBothConditionsTrue();
}

进一步的代码确实取决于你想用这些信息做什么

我没有足够的声誉来发表评论所以单独做了一个。

如果您的处理程序数量会增加,您可以在 MyClass 中创建状态对象,通过添加额外的抽象级别来存储所有条件:

void MyClass::handleReady(State& state)
{
    qDebug() << "Ready to do next step";
    state.m_conditionA.setFlag(true);
}

...但是你需要实现从 QObject 继承的 State class 和 State 的条件持有者 class 来发射当调用 setFlag 时发出信号 flagChanged。然后 connect(m_conditionA, &Condition::flagChanged, this, &State::checkAllConditions) 并将所有条件存储在某个关联容器中。