【问题标题】:How do you implement a choice in a state machine in Qt?如何在 Qt 的状态机中实现选择?
【发布时间】:2021-09-03 20:15:54
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: qt qstatemachine


    【解决方案1】:

    许可声明:

    除了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();
            }
        });
    }
    

    transitionToTrueTargettransitionToFalseTarget 当然是信号。

    对于问题中的例子,类可以这样使用:

    auto choiceState = new BooleanChoiceTransition([this](){ return _someConditionFullfilled; }, s2, s3);
    s1->addTransition(this, &MyClass::someTrigger, choiceState);
    

    由于BooleanChoiceTransitionQState,因此甚至可以轻松嵌套:

    auto outerChoiceState = new BooleanChoiceTransition([this](){ return _someOtherConditionFullfilled; }, s4, choiceState);
    

    【讨论】:

      猜你喜欢
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多