2016-09-14 200 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我正在使用工具來替換書面手冊。該工具自動執行一些手動步驟,其他步驟需要手動完成。如果我正在進入狀態初始化(已完成一個步驟),我想要設置此步驟的狀態。如果出現問題(前提不成功或點擊取消),我正在進入狀態初始化並設置狀態。如果我正在進入狀態初始狀態,我必須知道以前是否有問題。因此,我正在尋找機會來找出哪些信號導致我的SLOT EnterStateInit()作出反應並設置步驟的狀態。 – Lehtim

+0

那麼,爲什麼你不爲錯誤創建一個新的狀態呢?畢竟,這是一個不同的狀態。 – thuga

回答

1

一個QState是-一個QObject。這是怎麼回事,你可以自由地重新實現其event()方法:)要獲得一個想法:

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

你可以向我解釋這個重新實現是怎麼樣的?也許是一個QState的例子?我查看了qobject :: event()方法的doc.qt.io文檔,但完全不理解它。我該如何執行這些QEvent。這個QEvent會是導致轉變的信號,它會是怎樣的? – Lehtim

+0

使用'qDebug()'來了解什麼事件進來,並據此採取行動。 –

相關問題