2011-12-15 14 views
7

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

+0

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

+0

@ExpatEgghead consulte http://stackoverflow.com/questions/2533132/how-to-get-this-qt-state-machine-towork para que le ayude –

+0

@ExpatEgghead: ¿Cuál es su versión de Qt, 4.7 o 4.8? ? – menjaraz

Respuesta

13

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 
} 
+0

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

+0

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

+0

@ExpatEgghead: creo que puede recibir más atención si puede proporcionar un código completo que ilustre su problema. – menjaraz

5

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"); 
0

De Qt 5.7 Documentation

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 
} 
0

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:

http://doc.qt.io/qt-5/qstatemachine.html#started

Cuestiones relacionadas