Я создал QStateMachine, и мне нужно получить Событие, которое вызвало изменение состояния. Нет ли возможности проникнуть внутрь моего слота? EnterStateInit()
сигнал, вызвавший этот звонок. Вот мой пример кода:
CreateStateMachine()
{
QState *Init = new QState();
QState *CheckPrecondition = new QState();
QState *DoWork = new QState();
Init->addTransition(this, SIGNAL(EventStart()), CheckPrecondition);
CheckPrecondition->addTransition(this, SIGNAL(EventSuccesfulCondition()), DoWork);
CheckPrecondition->addTransition(this, SIGNAL(EventNotSuccesfulCondition()), Init);
DoWork->addTransition(this, SIGNAL(EventWorkDone()), Init);
DoWork->addTransition(this, SIGNAL(EventError()), Init);
connect(Init, SIGNAL(entered()), this, SLOT(EnterStateInit()));
connect(CheckPrecondition, SIGNAL(entered()), this, SLOT(CheckPrecondition()));
connect(DoWork, SIGNAL(entered()), this, SLOT(DoWork()));
connect(Init, SIGNAL(exited()), this, SLOT(LeaveStateInit()));
connect(CheckPrecondition, SIGNAL(exited()), this, SLOT(LeaveStateCheckPrecondition()));
connect(DoWork, SIGNAL(exited()), this, SLOT(LeaveDoWork()));
mModuleStateMachine.addState(Init);
mModuleStateMachine.addState(CheckPrecondition);
mModuleStateMachine.addState(DoWork);
mModuleStateMachine.start();
}
EnterStateInit()
{
/* Get Event which caused this SLOT to react */
SetStatus();
}
QState
это QObject
, Вы можете переопределить его event()
метод 🙂 Чтобы получить представление о том, что происходит:
void MyState::event(QEvent * event) {
qDebug() << event;
QState::event(event);
}
Других решений пока нет …