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

Adv*_*emy 4 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")
                    });
    }

}
Run Code Online (Sandbox Code Playgroud)

我连接了一个新函数,但是它会同时显示"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");
}
Run Code Online (Sandbox Code Playgroud)

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

2017-6-13 更新:

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

还有一个简单的问题,为什么 window 组件完成得比 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")
                    });

    }
Run Code Online (Sandbox Code Playgroud)

der*_*erM 9

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

您只能在onSignal.connect(say)事先连接后断开连接。你可以在Component.onCompleted.
如果您使用以下语法:

onSignal: say()
Run Code Online (Sandbox Code Playgroud)

这等于

onSignal.connect(function() { say() })
Run Code Online (Sandbox Code Playgroud)

因此您不能使用onSignal.disconnect(say)assay从未连接过。(我不知道它是连接到onSignal还是连接到signal- 两者都可以手动完成,或者根本没有连接。如果没有对隐式创建的函数的引用,您无法断开它。)


在 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)
} 
Run Code Online (Sandbox Code Playgroud)