2016-03-28 18 views
4

Bir C++ sınıfına sahibim ve bunu QML'de oluşturabilmem mümkün oldum. Sonra bu nesneyi temsil eden bir argümanı olan QML'de bir sinyal var. QtQml.StateMachine kullanıyorum ve SignalTransition ile tetiklenen sinyalleri yakalarım. SignalTransition tetiklendiğinde sinyallerimi argümanını bir sonraki duruma ayarlayabilmek istiyorum. kodunda:SignalTransition sırasında QML StateMachine içinde bir Sinyal argümanı nasıl kullanılır

Bu benim sinyal Model.qml gibi görünüyor: State.qml içinde

signal mySignal(CustomObject customObject) 

Benim sinyal geçiş halindeki kodu: aşağıdaki hatayı alıyorum

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. Sinyali gönderirken, customObject parametresini sinyal için bir argüman olarak geçiriyorum.

cevap

1

bir yaklaşım mySignal işleyicisi özet çok gibi daha az esnek SignalTransition erişilebilir bir özelliği ayarlamak sahip olacaktır:

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

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

Hacky ve test edilen, ama bu durum için kabul edilebilecekse de, .

+0

Cevabınız için teşekkür ederiz. Evet, şu anda bunu yapıyorum ve mükemmel çalışıyor, ama söylediğin gibi biraz hacky ve daha güzel bir çözüm olup olmadığını merak ediyordum. Bu örnekle: http://doc.qt.io/qt-5/qml-qtqml-statemachine-signaltransition.html#guard-prop, soruyu yazarken nasıl çalıştığını biraz almalıyım, ama yine de hata. – Silex

+0

Doğru, o zaman bilmiyorum. Sorunun işe yaradığı kod için, tetiklenen sinyalin bir şekilde argümanları, hangi şekilde değil, arayan sinyalden taşıyacağını düşünüyorum? –

0

Bu bir kesmek gibidir, ancak guard sinyalinin parametrelerini geçmiştir. guard, doğru olup olmadığını (ve eğer varsa, geçişin geçerli olduğunu) görmek için değerlendirilen bir ifadedir, ancak orada fazladan kod çalıştırmanızı engelleyen hiçbir şey yoktur. Bu nedenle:

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; 
    } 
}