2014-12-19 28 views
5

W QML niemożliwe jest, aby zadzwonić .disconnect() bez argumentów na sygnał:Czy można odłączyć wszystkie gniazda od sygnału Qt5 QML?

file:mainwindow.qml:107: Error: Function.prototype.disconnect: no arguments given 

Więc jak mogę odłączyć wszystkie szczeliny bez określenia każdej z nich? A może jest to możliwe, przekazując obiekt sygnału do C++ i odłączyć go jakoś tam? A może istnieje jakieś obejście problemu?

Celem, do którego chcę dotrzeć, jest zmiana zachowania obiektu poprzez podłączenie różnych gniazd do jego sygnału. Na przykład:

object.disconnect() // disconnect all slots 
object.connect(one_super_slot) 
object.disconnect() // disconnect all slots 
object.connect(another_super_slot) 

Odpowiedz

1

porządku, 5 minut po moim pytaniu Zrobiłem obejście: connect tylko raz do jednego sygnału, który wywołuje JSObject od wewnątrz:

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') 
      } 
     } 
    } 
} 

Więc JS obiekt może zostać przeniesiony tyle razy, ile chcesz, możesz zmienić swoje zachowanie, ponownie przypisując ten obiekt. Jeśli chcesz odłączyć wszystkie proste przypisz undefined do fire. Ponadto można tworzyć łańcuch „szczelin” za pomocą kodu modyfikującego do czegoś podobnego:

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

Więc każdy może realizować własną architekturę sygnału gniazdo w QML jako prosty javascript wzorzec obserwatora. Ciesz się.

4

Nie patrzyłem na kod źródłowy w qv4objectwrapper.cpp, można zobaczyć ten kod:

void QObjectWrapper::initializeBindings(ExecutionEngine *engine) 
{ 
    engine->functionClass->prototype->defineDefaultProperty(QStringLiteral("connect"), method_connect); 
    engine->functionClass->prototype->defineDefaultProperty(QStringLiteral("disconnect"), method_disconnect); 
} 

to są tylko dwa sposoby, które są dodawane. Jeśli spojrzysz na kod źródłowy dla method_disconnect(), zobaczysz, że zawsze wymaga jednego lub dwóch parametrów, w tym nazwy gniazda do rozłączenia.

Nie ma niestety disconnectAll().