2013-03-15 1 views
0

상태 머신에 s1, s2, s3 및 s4의 세 가지 상태가 있습니다. 상태 s1, s2 및 s3에서 오류 상태를 입력 할 수 있습니다.QStateMachine 오류 상태

QStateMachine machine; 
QState *s1 = new QState(); 
QState *s2 = new QState(); 
QState *s3 = new QState(); 
QFinalState *s4 = new QFinalState(); 
s1->addTransition(object, SIGNAL(done()), s2); 
s2->addTransition(object, SIGNAL(done()), s3); 
s3->addTransition(object, SIGNAL(done()), s4); 
machine.addState(s1); 
machine.addState(s2); 
machine.addState(s3); 
machine.addState(s4); 
machine.setInitialState(s1); 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 나는 그것을 위해 인터넷 검색을하고 있었지만 행운은 없었다. 이런 식으로해도 괜찮습니까? 그것이 작동처럼

QFinalState *sx = new QFinalState(); 
machine.addState(sx); 
s1->addTransition(object, SIGNAL(error()), sx); 
s2->addTransition(object, SIGNAL(error()), sx); 
s3->addTransition(object, SIGNAL(error()), sx); 
+0

때때로 state1, state2, state3을 하나의 수퍼 상태로 만드는 것이 유용 할 수 있습니다. 수퍼 상태에서 오류 상태로 한 전환을 추가하기 만하면됩니다. 모든 하위 주들도이 전환을 "따라 가게됩니다". –

답변

1
QFinalState *sx = new QFinalState(); 
machine.addState(sx); 
s1->addTransition(object, SIGNAL(error()), sx); 
s2->addTransition(object, SIGNAL(error()), sx); 
s3->addTransition(object, SIGNAL(error()), sx); 

네, 보이는 그. 모든 상태에 대해 addTransition()을 호출하는 것은 약간 번거로울 수 있으므로 부모 상태를 추가하여 모든 상태를 그룹화 할 수 있습니다. 그런 다음 부모에 대해 하나의 오류 전환 만 필요할 것입니다.