gpt4 book ai didi

qt - qml中如何断开一个信号的方法?

转载 作者:行者123 更新时间:2023-12-02 07:21:38 24 4
gpt4 key购买 nike

在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”,如何删除旧方法并重新定义 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")
});

}

最佳答案

您无法断开默认信号处理程序 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)
}

关于qt - qml中如何断开一个信号的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44496742/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com