首页 > 解决方案 > 检测“属性更改”事件

问题描述

var1file1.qml 中声明了一个属性。该属性在其他 qml 文件中可见,但无法检测到它的事件onChange

文件 1.qml:

Item {
 id: obj1Id
 property int var1: 0
 ...
 Component.onCompleted: {
  var1=2
  var1Changed()             <<<<<<<<<<<< emit signal "changed"
 }
 onVar1Changed: {}          <<<<<<<<<<<< signal is detected
 ...
}

文件2.qml:

Item {
 id: obj2Id
 property int local_var: 0
 ...
 Component.onCompleted: {
  local_var = obj1Id.var1       <<<<<<<<<<<<<<<<< It is OK
 }
 onVar1Changed: {}              <<<<<<<<<<<<<<<<< Error
 obj1Id.onVar1Changed: {}       <<<<<<<<<<<<<<<<< Error
 ...
}

是否有可能这种方法或 file2.qml 必须添加property int local_var: obj1Id.var1然后onLocal_varChanged: {}

标签: qtqml

解决方案


您的代码中有一些时刻可能会带来误解。首先弄清楚它是有道理的。

你写了:

 Component.onCompleted: {
  var1=2
  var1Changed()             <<<<<<<<<<<< emit signal "changed"
 }

但您不需要手动发出该信号。QML 会为你做这件事。所以,实际上没有这条线什么都不会改变。


你写了

 property int local_var: 0
 ...
 Component.onCompleted: {
  local_var = obj1Id.var1       <<<<<<<<<<<<<<<<< It is OK
 }

这是完全有效的代码,但您需要了解这是一次性分配,而不是将值绑定obj1Id.var1local_var,例如,如果您更改obj1Id.var1- 不要期望local_var分别更改。

要对值进行真正的绑定,您可以使用Binding组件Qt.binding从 JavaScript 创建属性绑定,或者按照您的建议——添加属性int local_var: obj1Id.var1


在任何情况下,您都需要obj1Id在您的file2.qml.

如果绑定方法不适合您——您可以使用ConnectionsQML Type

在你的情况下,这段代码应该放在里面file2.qml

Connections {
  target: obj1Id
  onVar1Changed: console.log("obj1Id.var1 changed")
}

推荐阅读