2014-12-19 10 views
5

bir sinyal kanıtlar olmaksızın .disconnect() çağırmak mümkün değildir:Qt5 QML'deki bir sinyalden tüm yuvaların bağlantısı kesilebilir mi? QML yılında

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

Peki nasıl her biri belirtmeden TÜM yuvaları kesebilirsiniz? Veya belki de sinyal nesnesini C++'a geçirerek ve bunu bir şekilde kesmek mümkün mü? Veya herhangi bir geçici çözüm var mı?

Ulaşmak istediğim hedef, sinyale farklı yuvalar bağlayarak bir nesnenin davranışını değiştirmek. Örneğin:

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

Yani bu nesne yeniden atanabilir js: İçten JSObject çağıran bir sinyale sadece bir kez bağlamak:

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

cevap

1

Tamam, 5 dakika sorumu sonra geçici bir çözüm yaptık İstediğiniz kadar çok kez, bu nesneyi yeniden atayarak davranışınızı değiştirebilirsiniz. undefined tüm basit atamayı fire ile bağlantısını kesmek isterseniz.

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

Yani herkes basit javascript gözlemci deseni olarak QML içinde kendi sinyal yuvası mimarisini uygulayabilirsiniz: Ayrıca böyle bir şeye değiştirerek kod tarafından "yuvaları" zinciri yapabilirsiniz. Keyfini çıkarın.

4

sayılı Ben qv4objectwrapper.cpp kaynak koduna baktım ve bu kodu görebilirsiniz:

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

olanlar eklenir sadece iki yöntem vardır. method_disconnect() için kaynak koduna bakarsanız, her zaman bir veya iki parametre gerektirir, bağlantının kesilmesi gereken yuva adı da dahildir.

Maalesef, disconnectAll() var.