运行 一个函数取决于多个信号
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;
}
我打算 运行 一些代码(如函数),这取决于两个条件:
- 收到第一个信号,即
ready
- 接收到第二个信号,即
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)
并将所有条件存储在某个关联容器中。
我有两个不一定同时收到的信号。
第一个信号
第一个信号由 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;
}
我打算 运行 一些代码(如函数),这取决于两个条件:
- 收到第一个信号,即
ready
- 接收到第二个信号,即
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)
并将所有条件存储在某个关联容器中。