在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")
});
}
答案 0 :(得分:4)
您无法断开默认信号处理程序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)
}
答案 1 :(得分:1)
您尚未使用显式connect()
函数开头。要disconnect()
函数,必须使用connect()
显式连接。
这里有一个例子可能会有所帮助:
http://doc.qt.io/qt-5/qtqml-syntax-signals.html#connecting-signals-to-methods-and-signals