2016-09-14 2 views
0

QStateMachine을 만들었으므로 상태가 전환 된 이벤트를 가져와야합니다. 내 슬롯 EnterStateInit()에이 전화를 걸었을 때 신호를받을 기회가 없습니까? 여기 내 예제 코드 :QStateMachine 상태 가져 오기 이벤트가 발생합니다.

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(); 
} 
+0

정확히 무엇을하려합니까? – thuga

+0

@thuga 필자는 서면 매뉴얼을 대체하기 위해 Tool에서 일하고있다. 이 도구는 일부 수동 단계를 자동으로 수행하고 다른 단계는 수동으로 수행해야합니다. State Init에 들어가면 (한 단계 완료)이 단계의 상태를 설정하고 싶습니다. 무언가 잘못 되었으면 (Precondition unsuccesful 또는 Cancel이 클릭 되었음) 상태 Init로 들어가고 상태를 설정합니다. 상태 Init에 들어가기 전에 무언가 잘못되었는지 알아야합니다. 따라서 어떤 신호로 인해 SLOT EnterStateInit()이 반응하여 단계의 상태를 설정하는지 알 수있는 기회를 찾고 있습니다. – Lehtim

+0

그러면 오류의 새 상태를 만들어 보지 않으시겠습니까? 결국, 그것은 다른 상태입니다. – thuga

답변

1

QState은-A QObject. event() 메서드를 다시 구현할 수 있습니다. 무슨 일이 일어나고 있는지 알기 위해서 :

void MyState::event(QEvent * event) { 
    qDebug() << event; 
    QState::event(event); 
} 
+0

이 재 구현이 어떻게 생겼는지 설명해 주시겠습니까? 어쩌면 QState의 예가 될까요? qobject :: event() 메서드의 doc.qt.io 문서를 살펴 보았지만 완전히 이해하지 못했습니다. QEvent를 어떻게 구현해야합니까? 이 QEvent가 전환을 유발하는 신호이며 어떻게 보입니까? – Lehtim

+0

'qDebug()'를 사용하여 어떤 이벤트가 들어 왔는지에 대한 아이디어를 얻고 그에 따라 행동하십시오. –