是否可以从Qt5 QML中的信号断开所有插槽?

维克托·波列沃(Victor Polevoy)

在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)
维克托·波列沃(Victor Polevoy)

好的,在我提出问题后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观察者模式。请享用。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

QT5中的信号和插槽

来自分类Dev

QT5 C++ 信号到 QML 插槽不起作用

来自分类Dev

如何在Qt5中检查url是否可用?

来自分类Dev

如何在Qt5中检查url是否可用?

来自分类Dev

Qt5:无法将信号连接到插槽

来自分类Dev

是否需要Q_INVOKABLE才能在Qt5中从QML调用公共QObject函数?

来自分类Dev

Qt 插槽和信号:MainWindow 中没有匹配函数

来自分类Dev

Qt5是否有任何类似于StringBuilder或StringBuffer的类?

来自分类Dev

Qt5 QML ListView内容缩放

来自分类Dev

qt5 qml c ++交互

来自分类Dev

是否在Qt5中用MainWindow初始化了MainWindow?

来自分类Dev

如何将多个信号连接到 QT/QML 中的一个插槽?

来自分类Dev

Qt5发出的语法接受插槽名称。插槽是否通过事件队列处理

来自分类Dev

带有qt5的无框窗户(qml)

来自分类Dev

带有qt5(qml)的无框窗户

来自分类Dev

qt5 cmake没有automoc

来自分类Dev

QML QT5中如何显示分配的属性组件?

来自分类Dev

在Qt5中创建QVideoWidget

来自分类Dev

获取Qt5中的语言列表

来自分类Dev

在QT5中实现原子队列

来自分类Dev

Qt5中的OpenGl实例渲染

来自分类Dev

继承的对象[Qt5]中出现信号和插槽问题

来自分类Dev

继承的对象[Qt5]中出现信号和插槽问题

来自分类Dev

qt5:将过载信号和插槽功能与static_cast连接

来自分类Dev

Qt5:虽然已连接,但发出信号但未调用插槽

来自分类Dev

杀死所有使用 qt5 的进程

来自分类Dev

如何准备带有Raspbian的Raspberry Pi,以便可以从Linux主机交叉编译Qt5程序?

来自分类Dev

如何准备带有Raspbian的Raspberry Pi,以便可以从Linux主机交叉编译Qt5程序?

来自分类Dev

带有QT5“ Qt5 :: QtCore”的现代CMake 3,但未找到目标

Related 相关文章

热门标签

归档