如何在qml中断开信号的方法?

时间:2017-06-12 10:05:26

标签: qt qml

在QML中,在某些情况下,我需要将旧方法移除到信号并重新定义一种新方法来处理信号,演示如下:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    MouseArea {
        id:mouse
        anchors.fill: parent
        onClicked: {
            console.log("11111");
        }
    }


    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }

    Component.onCompleted: {
        //if(false){
        //}
        // mouse.clicked = null;
        //mouse.clicked.disconnect();

        mouse.clicked.connect(
                    function(){
                        console.log("22222")
                    });
    }

}

我连接了一个新功能,但它会显示两个" 11111"和" 22222" ,似乎它添加了一个新函数来处理信号。

我尝试过设置" mouse.clicked = null "仍然无法正常工作。

我也尝试断开方法,如下所示:

MouseArea {
    id:mouse
    anchors.fill: parent
    onClicked:say()
}

Component.onCompleted: {
    mouse.clicked.disconnect(say);
    mouse.clicked.connect(
                function(){
                    console.log("22222")
                });
}

function say(){
    console.log("11111");
}

仍打印" 11111"和" 22222",如何删除旧的methond并重新定义 Component.onCompleted()中的方法?

2017-6-13更新:

谢谢,伙计。我也使用连接,仍然无法断开,因为我使用qt5.6.1,没有启用属性:(。如果我们使用显式connect()函数,它的工作原理。但在我的情况下,我想我无法连接方法,我需要检查一些If情况来定义是否需要删除Component.onCompleted中的信号处理程序。

同样是一个简单的问题,为什么窗口组件比mouseArea完成得更快?日志"首先加载"先加载。

  MouseArea {
        id:mouse
        anchors.fill: parent
        Connections{
            onClicked:say()
        }
        Component.onCompleted: {
            //mouse.clicked.connect(say)
            console.log("second load")
        }
    }

    Component.onCompleted: {
        console.log("first load")
        mouse.clicked.connect(
                    function(){
                        mouse.clicked.disconnect(say);
                        //mouse.clicked.disconnect(say);
                        console.log("22222")
                    });

    }

2 个答案:

答案 0 :(得分:4)

您无法断开默认信号处理程序onSignal: { do what ever }

当您事先与onSignal.connect(say)连接时,您只能断开连接。您可以在Component.onCompleted中执行此操作 如果您使用语法:

onSignal: say()

这等于

onSignal.connect(function() { say() })

因此您无法使用onSignal.disconnect(say)因为say从未连接过。 (我不知道它是否与onSignalsignal相关联 - 两者都可以手动完成,或者根本不连接。您无法断开连接,没有引用隐式创建的函数。)

在QML中,更好的方法是保持声明性。为此,您可以使用Connections - construct:

Connections {
    target: mouse // set to null to disconnect (Qt<=5.6)
    onClicked: { do what ever }
    enabled: true // change this, when you want to disconnect it (Qt>=5.7)
} 

答案 1 :(得分:1)

您尚未使用显式connect()函数开头。要disconnect()函数,必须使用connect()显式连接。

这里有一个例子可能会有所帮助:

http://doc.qt.io/qt-5/qtqml-syntax-signals.html#connecting-signals-to-methods-and-signals