2013-03-15 119 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); 

這樣做的最好方法是什麼?我正在Google上搜索,但沒有運氣。 可以做這樣的事嗎?

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放入一個超級狀態可能會很有用。那麼您只需添加一個從超級狀態到錯誤狀態的轉換。所有的子州也將「跟隨」這一轉變。 – 2013-04-05 14:20:34

回答

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()可能有點麻煩,因此可以通過向它們添加父狀態來將所有狀態分組。然後,您只需要在父級上進行一次錯誤轉換。