Okay, 5 minuti dopo la mia domanda ho fatto una soluzione: collegare solo una volta per un segnale che chiama JSObject dall'interno:
Item {
property var fire
// Any qml object. In this example it is ActionExecutor which emits actionRequest
ActionExecutor {
//signal actionRequest(int actionType)
onActionRequest: fire(actionType)
}
Action {
shortcut: "Ctrl+S"
text: "One action"
onTriggered: {
parent.fire = function(actionType) {
console.log('one slot')
}
}
}
Action {
shortcut: "Ctrl+X"
text: "Another action"
onTriggered: {
parent.fire = function(actionType) {
console.log('Another slot')
}
}
}
}
Affinché JS oggetto può essere riassegnato molte volte come vuoi in modo da poter cambiare il tuo comportamento riassegnando questo oggetto. Se si desidera disconnettere tutte le semplici assegnate undefined
a fire
. Inoltre è possibile effettuare una catena di "slot" per codice modificando a qualcosa di simile:
Item {
property var fire
property var slots: [
function(actionType) {
console.log('1: ' + actionType)
},
function() {
console.log('2: ' + actionType)
},
function() {
console.log('3: ' + actionType)
}
]
// Any qml object. In this example it is ActionExecutor which emits actionRequest
ActionExecutor {
//signal actionRequest(int actionType)
onActionRequest: fire(actionType)
}
Action {
shortcut: "Ctrl+S"
text: "One action"
onTriggered: {
parent.fire = function(actionType) {
console.log('calling all custom JS-slots')
for (var i in slots) {
slots[i](actionType)
}
}
}
}
}
quindi chiunque può implementare propria architettura del segnale slot in QML come un modello semplice osservatore javascript. Divertiti.
fonte
2014-12-19 18:49:52