是否可以在Qt5 QML中断开所有插槽与信号的连接?

时间:2014-12-19 18:34:09

标签: qt qml signals disconnect slot

在QML中,如果没有信号参数,则无法调用.disconnect()

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)

2 个答案:

答案 0 :(得分:5)

没有。我查看了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()

答案 1 :(得分: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对象,这样您就可以通过重新分配此对象来更改行为。如果您要将所有简单分配undefinedfire断开连接。您还可以制作一系列" 广告位"通过将代码修改为:

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中实现自己的信号槽架构作为一个简单的javascript观察者模式。 享受。