许可声明:
除了default StackOverflow license,您也可以通过MIT License 使用此代码。
我用这样的构造函数创建了一个BooleanChoiceTransition 类(可能包含错误,代码不在这台机器上,所以我记下了它):
BooleanChoiceTransition::BooleanChoiceTransition(std::function<bool()> choiceFunc, QState* targetForTrueCase, QState* targetForFalseCase)
: QState{}
{
this->addTransition(this, &BooleanChoiceTransition::transitionToTrueTarget, targetForTrueCase);
this->addTransition(this, &BooleanChoiceTransition::transitionToFalseTarget, targetForFalseCase);
(void)QObject::connect(this, &QAbstractState::entered, [this]() {
if(choiceFunc())
{
emit transitionToTrueTarget();
}
else
{
emit transitionToFalseTarget();
}
});
}
transitionToTrueTarget 和 transitionToFalseTarget 当然是信号。
对于问题中的例子,类可以这样使用:
auto choiceState = new BooleanChoiceTransition([this](){ return _someConditionFullfilled; }, s2, s3);
s1->addTransition(this, &MyClass::someTrigger, choiceState);
由于BooleanChoiceTransition 是QState,因此甚至可以轻松嵌套:
auto outerChoiceState = new BooleanChoiceTransition([this](){ return _someOtherConditionFullfilled; }, s4, choiceState);