我創建了一個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();
}
什麼是你想要做什麼呢? – thuga
@thuga我正在使用工具來替換書面手冊。該工具自動執行一些手動步驟,其他步驟需要手動完成。如果我正在進入狀態初始化(已完成一個步驟),我想要設置此步驟的狀態。如果出現問題(前提不成功或點擊取消),我正在進入狀態初始化並設置狀態。如果我正在進入狀態初始狀態,我必須知道以前是否有問題。因此,我正在尋找機會來找出哪些信號導致我的SLOT EnterStateInit()作出反應並設置步驟的狀態。 – Lehtim
那麼,爲什麼你不爲錯誤創建一個新的狀態呢?畢竟,這是一個不同的狀態。 – thuga