2

想象一下你的状态机的一部分看起来像这样:

您如何正确实现 Qt 中的选择部分?我知道有保护转换,但这意味着我需要:

  • 创建一个QAbstractTransition的子类,它接受例如一个std::function<bool()>和一个标志,该标志确定当该布尔结果为真或为假时是否发生转换
  • 使用相同的布尔函数创建此类的两个实例,但转换保护相反
  • S1使用这两个实例添加两个转换。

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

4

1 回答 1

2

许可通知:

作为默认 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);

由于BooleanChoiceTransitionis a QState,这甚至可以很容易地嵌套:

auto outerChoiceState = new BooleanChoiceTransition([this](){ return _someOtherConditionFullfilled; }, s4, choiceState);
于 2021-09-02T15:07:54.750 回答