2017-06-12 61 views
0

在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日:

感谢,guys.I也使用连接,仍然不能断开,因为我用qt5.6.1,没有使财产:(如果我们用显式连接。 ()函数,它的工作原理。但对我来说,我觉得我无法连接的方法,我需要检查一些情况下,如果确定我是否需要删除信号处理程序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") 
        }); 

    } 

回答

1

不能断开默认的信号处理程序onSignal: { do what ever }

只有在您事先与onSignal.connect(say)连接时才能断开连接。你可以在Component.onCompleted中这样做。
如果您使用的语法:

onSignal: say() 

这等于

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

,因此你不能用onSignal.disconnect(say)作为say从未接通。 (我不知道它是连接到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) 
} 
+0

喜真皮,连接仍然没有按“T工作,我尝试了用Qt5.6.1,没有属性:启用。 – AdvancingEnemy

+0

哦,好的。我没有看到,该属性是在Qt5.7中引入的(http://doc.qt.io/qt-5/qml-qtqml-connections.html#enabled-prop)。 – derM

+0

我给我的代码添加了评论。您可以将'target'设置为'null'以在Qt5.6及更早版本中停用'Connection'。 – derM