У меня есть два виджета, которые можно проверить, и числовое поле ввода, которое должно содержать значение больше нуля. Всякий раз, когда оба виджета были отмечены, а числовое поле ввода содержит значение больше нуля, кнопка должна быть включена. Я борюсь с определением правильной машины состояний для этой ситуации. Пока у меня есть следующее:
QStateMachine *machine = new QStateMachine(this);
QState *buttonDisabled = new QState(QState::ParallelStates);
buttonDisabled->assignProperty(ui_->button, "enabled", false);
QState *a = new QState(buttonDisabled);
QState *aUnchecked = new QState(a);
QFinalState *aChecked = new QFinalState(a);
aUnchecked->addTransition(wa, SIGNAL(checked()), aChecked);
a->setInitialState(aUnchecked);
QState *b = new QState(buttonDisabled);
QState *bUnchecked = new QState(b);
QFinalState *bChecked = new QFinalState(b);
employeeUnchecked->addTransition(wb, SIGNAL(checked()), bChecked);
b->setInitialState(bUnchecked);
QState *weight = new QState(buttonDisabled);
QState *weightZero = new QState(weight);
QFinalState *weightGreaterThanZero = new QFinalState(weight);
weightZero->addTransition(this, SIGNAL(validWeight()), weightGreaterThanZero);
weight->setInitialState(weightZero);
QState *buttonEnabled = new QState();
buttonEnabled->assignProperty(ui_->registerButton, "enabled", true);
buttonDisabled->addTransition(buttonDisabled, SIGNAL(finished()), buttonEnabled);
buttonEnabled->addTransition(this, SIGNAL(invalidWeight()), weightZero);
machine->addState(registerButtonDisabled);
machine->addState(registerButtonEnabled);
machine->setInitialState(registerButtonDisabled);
machine->start();
Проблема заключается в следующем переходе:
buttonEnabled->addTransition(this, SIGNAL(invalidWeight()), weightZero);
заставляет все дочерние состояния в состоянии registerButtonDisabled
возвращаться в исходное состояние. Это нежелательное поведение, так как я хочу, чтобы состояния a
и b
оставались в одном состоянии.
Как я могу гарантировать, что a
и b
остаются в одном состоянии? Есть ли другой/лучший способ решить эту проблему с помощью государственных машин?
Примечание. Есть бесчисленные (возможно, лучшие) способы решения этой проблемы. Однако меня интересует только решение, в котором используется конечный автомат. Я думаю, что такой простой случай использования должен быть разрешен с использованием простой конечной машины, правильно?