2014-12-19 4 views
5

В QML это нельзя назвать .disconnect() без аргументов для сигнала:Можно ли отключить все слоты от сигнала в Qt5 QML?

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

Так как я могу отключить все слоты без указания каждого из них? Или возможно, пропустив объект сигнала до C++ и отключите его каким-то образом? Возможно, существует ли какое-либо обходное решение?

Цель, которую я хочу достичь, - изменить поведение объекта, подключив разные слоты к его сигналу. Например:

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

ответ

1

Ладно, через 5 минут после моего вопроса я сделал обходной путь: подключить только один раз на один сигнал, который вызывает JSObject изнутри:

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

Так что Js объект может быть переназначен много раз, как вы хотите, чтобы вы могли изменить свое поведение, переназначив этот объект. Если вы хотите отключить все простые назначения undefined до fire. Также вы можете сделать цепочку из «слотов» путем изменения коды на что-то вроде:

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

Таким образом, любой может реализовать собственную архитектуру сигнала слота в QML как простой яваскрипт шаблон наблюдателя. Наслаждайтесь.

4

Нет, я смотрел на исходный код в qv4objectwrapper.cpp, и вы можете увидеть этот код:

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

только эти два метода, которые добавляются. Если вы посмотрите на исходный код для method_disconnect(), вы увидите, что для него всегда требуется один или два параметра, включая имя слота для разъединения.

К сожалению, нет disconnectAll().