2016-03-28 21 views
4

我有一個C++類,並且我可以在QML中創建它。然後我在QML中有一個信號,它有一個代表這個對象的參數。我正在使用QtQml.StateMachine,我用SignalTransition來捕捉觸發信號。我希望能夠在觸發SignalTransition時將我的信號參數設置爲下一個狀態。在代碼:如何在SignalTransition期間在QML StateMachine中使用Signal的參數

這是我的信號怎麼看起來像Model.qml:

signal mySignal(CustomObject customObject) 

我的信號轉變代碼State.qml:

import QtQml.StateMachine 1.0 as SM 

// SM.State { ... 

Model { 
    id: model 
    // ... 
} 

SM.SignalTransition { 
    targetState: nextState 
    signal: model.mySignal 
    onTriggered: console.log(customObject) // error here 
} 

// ... } 

我得到以下錯誤:ReferenceError: customObject is not defined。 當我發出信號時,我傳遞了我的customObject作爲信號的參數。

回答

1

一個辦法是有mySignal處理程序設置,可以通過低撓性SignalTransition循簡易程序訪問,像這樣的屬性:

Model { 
    id: model 
    property CustomObject currentObj 
    onMySignal: currentObj = customObject 
} 

SM.SignalTransition { 
    targetState: nextState 
    signal: model.currentObjChanged 
    onTriggered: console.log(model.currentObj) 
} 

哈克並沒有測試過,但可能是這種情況下可以接受的。

+0

感謝您的回答。是的,這就是我現在正在做的事情,它的工作原理是完美的,但正如你所說的那樣,它有點冒險,並想知道是否有更好的解決方案。通過這個例子:http://doc.qt.io/qt-5/qml-qtqml-statemachine-signaltransition.html#guard-prop它應該如何工作,因爲我在我的問題中寫道,但我仍然得到錯誤。 – Silex

+0

對,那我不知道。我認爲你的問題的代碼工作,觸發信號會以某種方式攜帶主叫信號的參數,它顯然不是? –

0

這是一個黑客,但guard傳遞信號的參數。 guard是一個表達式,用於評估它是否爲真(如果是這樣,轉換適用),但沒有任何東西阻止您在其中運行額外的代碼。所以:

State { 
    targetState: nextState 
    signal: model.mySignal 
    guard: { 
     // here, customObject is available, because it was an arg to the signal 
     // so, stash it away somewhere where you can get at it later 
     root.currentCustomObject = customObject; 
     // and explicitly return true, so that this guard passes OK and 
     // then the transition actually happens 
     return true; 
    } 
}