如何在 Qt 的状态机中实现选择?
How do you implement a choice in a state machine in Qt?
想象一下您的状态机的一部分如下所示:
你如何正确地实现Qt中的选择部分?我知道有 guarded transitions,但这意味着我需要:
- 创建一个 QAbstractTransition 的子class,接受例如一个
std::function<bool()>
和一个标志,用于确定在该布尔结果为真或为假时是否发生转换
- 使用相同的布尔函数创建此 class 的两个实例,但转换守卫相反
- 使用这两个实例从
S1
添加两个转换。
对于像选择这样简单的事情,这种方法似乎有点笨拙且容易出错。
有没有更可维护的方法来实现这个?
许可声明:
替代 default Whosebug license you are hereby allowed to use this code through the MIT License。
我用这样的构造函数创建了一个BooleanChoiceTransition
class(可能有错误,代码不在本机上,所以我用心输入了):
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
当然是信号。
对于问题中的例子,class可以这样使用:
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);
想象一下您的状态机的一部分如下所示:
你如何正确地实现Qt中的选择部分?我知道有 guarded transitions,但这意味着我需要:
- 创建一个 QAbstractTransition 的子class,接受例如一个
std::function<bool()>
和一个标志,用于确定在该布尔结果为真或为假时是否发生转换 - 使用相同的布尔函数创建此 class 的两个实例,但转换守卫相反
- 使用这两个实例从
S1
添加两个转换。
对于像选择这样简单的事情,这种方法似乎有点笨拙且容易出错。 有没有更可维护的方法来实现这个?
许可声明:
替代 default Whosebug license you are hereby allowed to use this code through the MIT License。
我用这样的构造函数创建了一个BooleanChoiceTransition
class(可能有错误,代码不在本机上,所以我用心输入了):
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
当然是信号。
对于问题中的例子,class可以这样使用:
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);