如何在 Qt 的状态机中实现选择?

How do you implement a choice in a state machine in Qt?

想象一下您的状态机的一部分如下所示:

你如何正确地实现Qt中的选择部分?我知道有 guarded transitions,但这意味着我需要:

对于像选择这样简单的事情,这种方法似乎有点笨拙且容易出错。 有没有更可维护的方法来实现这个?

许可声明:

替代 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();
        }
    });
}

其中 transitionToTrueTargettransitionToFalseTarget 当然是信号。

对于问题中的例子,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);