Estoy intentando implementar una máquina de estado en Qt (C++). ¿Cómo puedo verificar el estado actual de QStateMachine? No pude encontrar un método en la documentación.C++ Qt: compruebe el estado actual de QStateMachine
THX
Estoy intentando implementar una máquina de estado en Qt (C++). ¿Cómo puedo verificar el estado actual de QStateMachine? No pude encontrar un método en la documentación.C++ Qt: compruebe el estado actual de QStateMachine
THX
has necesitado QStateMachine::configuration()
?
refieren http://www.qtcentre.org/threads/42085-How-to-get-the-current-state-of-QStateMachine
Extracto de la URL anterior:
// QStateMachine::configuration() gives you the current states.
while(stateMachine->configuration().contains(s2))
{
//do something
}
Bueno, sí, pero cuando lo probé, ninguno de los estados que había agregado estaban allí. No tengo mis propias clases QState, solo QStates regulares. – ExpatEgghead
Como parte de mi solicitud, debo enviar a otra máquina el estado actual de la aplicación. No parece sensato cazar a través de un Set para esto. Quizás mi error no fue crear una clase derivada para todos mis Estados. – ExpatEgghead
@ExpatEgghead: creo que puede recibir más atención si puede proporcionar un código completo que ilustre su problema. – menjaraz
Puede asignar la propiedad a la propia QStateMachine.
// QState m_State1;
// QState m_State2;
// QStateMachine m_Machine;
m_State1.assignProperty(m_Label, "visible", false);
m_State1.assignProperty(&m_Machine, "state", 1);
m_State2.assignProperty(m_Label, "visible", true);
m_State2.assignProperty(&m_Machine, "state", 2);
Luego, el estado actual se puede leer de la propiedad dinámica.
qDebug() << m_Machine.property("state");
Qset QStateMachine :: configuración() const
devuelve el conjunto consistente máxima de estados (incluyendo estados paralelos y final) de que esta máquina de estado está en. Si un estado s está en la configuración, siempre es el caso que el padre de s también esté en c. Sin embargo, tenga en cuenta que la máquina no es un miembro explícito de la configuración.
Ejemplo de uso:
bool IsInState(QStateMachine& aMachine, QAbstractState* aState) const
{
if (aMachine_.configuration().contains(aState)) return true;
return false
}
Soy consciente de que estoy llegando tarde, pero espero que esta respuesta ayuda a cualquier otra persona que se topa con esto.
Usted mencionó anteriormente que ya intentó usar la configuración(), pero ninguno de sus estados estaba allí, esto es porque start() es asíncrono.
Por lo tanto, suponiendo que haya llamado a la configuración() inmediatamente después de llamar a start(), tiene sentido que sus estados aún no estuvieran allí. Puede obtener la funcionalidad que desee utilizando la señal started() de la clase QStateMachine. Compruébelo usted mismo:
stateMachine->setInitialState(someState);
stateMachine->start();
connect(stateMachine, SIGNAL(started()), this, SLOT(ReceiveStateMachineStarted()));
Entonces, para su ranura ReceiveStateMachineStarted(), se podría hacer algo como esto:
void MyClass::ReceiveStateMachineStarted() {
QSet<QAbstractState*> stateSet = stateMachine->configuration();
qDebug() << stateSet;
}
Cuando su máquina de estado entra en su estado inicial, emitirá el inicio() señal. El espacio que ha escrito lo escuchará e imprimirá la configuración. Para más información sobre este tema, consulte la siguiente documentación de Qt:
tengo el mismo problema. Iterar el QSet that :: configuration proporciona get QAbstractState que no tiene un uso claro. Un ejemplo de trabajo sería genial. – ExpatEgghead
@ExpatEgghead consulte http://stackoverflow.com/questions/2533132/how-to-get-this-qt-state-machine-towork para que le ayude –
@ExpatEgghead: ¿Cuál es su versión de Qt, 4.7 o 4.8? ? – menjaraz