2013-03-15 2 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() для всех ваших состояний может быть немного громоздким, поэтому вы можете сгруппировать все свои состояния, добавив к ним родительское состояние. Тогда вам понадобится только один переход с ошибкой на родителя.

 Смежные вопросы

  • Нет связанных вопросов^_^