想象一下你的状态机的一部分看起来像这样:
您如何正确实现 Qt 中的选择部分?我知道有保护转换,但这意味着我需要:
- 创建一个QAbstractTransition的子类,它接受例如一个
std::function<bool()>
和一个标志,该标志确定当该布尔结果为真或为假时是否发生转换 - 使用相同的布尔函数创建此类的两个实例,但转换保护相反
S1
使用这两个实例添加两个转换。
对于像选择这样简单的事情,这种方法似乎有点笨拙且容易出错。是否有更可维护的方法来实现这一点?
想象一下你的状态机的一部分看起来像这样:
您如何正确实现 Qt 中的选择部分?我知道有保护转换,但这意味着我需要:
std::function<bool()>
和一个标志,该标志确定当该布尔结果为真或为假时是否发生转换S1
使用这两个实例添加两个转换。对于像选择这样简单的事情,这种方法似乎有点笨拙且容易出错。是否有更可维护的方法来实现这一点?
许可通知:
作为默认 StackOverflow 许可证的替代方案,您可以通过MIT 许可证使用此代码。
我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
is a QState
,这甚至可以很容易地嵌套:
auto outerChoiceState = new BooleanChoiceTransition([this](){ return _someOtherConditionFullfilled; }, s4, choiceState);