2011-01-27 6 views
1

J'ai besoin de voir si un événement personnalisé affiché sur la machine d'état a été accepté ou non. Mon approche est de sous-classer QStateMachine. Voir http://doc.qt.nokia.com/latest/statemachine-api.html section Événements, transitions et gardesComment puis-je détecter QEvent ignoré/rejeté à QStateMachine

Je me demande s'il n'y a pas quelque chose que j'ai manqué dans le code ci-dessous. N'y a-t-il pas une autre/meilleure approche?

Fondamentalement ici est le même que pour le Qt Doc:

bool MyStateTransition::eventTest(QEvent *e) 
{ 
    if (e->type() != QEvent::Type(QEvent::User+1)) // MyEvent 
     return false; 

    MyEvent *se = static_cast<MyEvent*>(e); 

    if(m_value != se->value) 
    { 
     se->setRejected(true); 
     return false; 
    } 
    qDebug() << "MyStateTransition::eventTest() - Transition " << m_value << " accepting event " << se->value; 
    se->setRejected(false); 
    return true; 
} 

Et la façon la plus simple que je pourrais trouver trop loin pour détecter le rejet est la suivante:

void MyStateMachine::endSelectTransitions(QEvent *event) 
{ 
    if (event->type() != QEvent::Type(QEvent::User+1)) return; 

    MyEvent *se = static_cast<MyEvent*>(event); 
    if(se->rejected()) 
     emit eventRejected(se); 
    else 
     //Not really needed since we can use triggered() which will fire after 
     emit eventAccepted(se); 

} 
+0

Qu'est-ce que cette méthode 'MyStateMachine :: endSelectTransitions'? –

+0

Une méthode virtuelle qui est appelée quand la machine d'état a "passé" toutes les transitions cibles, (partie de QStateMachine) –

+0

Je ne le vois pas dans docs. Pouvez-vous poster un lien? –

Répondre

0

Ok, enfin répondre à ma propre question: Cela fonctionne mais est fondamentalement un hack car pas officiellement documenté.