2017-06-12 175 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