Tengo dos widgets que se pueden verificar y un campo de entrada numérico que debe contener un valor mayor que cero. Siempre que se hayan verificado ambos widgets y el campo de entrada numérica contenga un valor mayor que cero, se debe habilitar un botón. Estoy luchando con la definición de una máquina de estado adecuada para esta situación. Hasta ahora tengo el siguiente:¿Cómo hacer funcionar esta máquina de estado Qt?
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();
El problema aquí es que la transición siguiente:
buttonEnabled->addTransition(this, SIGNAL(invalidWeight()), weightZero);
hace que todos los estados del niño en el estado registerButtonDisabled
a revertir a su estado inicial. Este es un comportamiento no deseado, ya que quiero que los estados a
y b
permanezcan en el mismo estado.
¿Cómo me aseguro de que a
y b
permanezcan en el mismo estado? ¿Hay alguna otra forma mejor de resolver este problema utilizando máquinas de estado?
Nota. Hay innumerables (posiblemente mejores) formas de resolver este problema. Sin embargo, solo estoy interesado en una solución que utiliza una máquina de estado. Creo que un caso de uso tan simple debería poder resolverse usando una máquina de estado simple, ¿verdad?
Parece que la codificación de una transición personalizada es de hecho el camino a seguir aquí. Estoy un poco decepcionado de que para un caso de uso aparentemente trivial se requiera una implementación tan elaborada :( –