qt - 检测“属性更改”事件
问题描述
var1
file1.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: {}
?
解决方案
您的代码中有一些时刻可能会带来误解。首先弄清楚它是有道理的。
你写了:
Component.onCompleted: {
var1=2
var1Changed() <<<<<<<<<<<< emit signal "changed"
}
但您不需要手动发出该信号。QML 会为你做这件事。所以,实际上没有这条线什么都不会改变。
你写了
property int local_var: 0
...
Component.onCompleted: {
local_var = obj1Id.var1 <<<<<<<<<<<<<<<<< It is OK
}
这是完全有效的代码,但您需要了解这是一次性分配,而不是将值绑定obj1Id.var1
到local_var
,例如,如果您更改obj1Id.var1
- 不要期望local_var
分别更改。
要对值进行真正的绑定,您可以使用Binding
组件或Qt.binding
从 JavaScript 创建属性绑定,或者按照您的建议——添加属性int local_var: obj1Id.var1
。
在任何情况下,您都需要obj1Id
在您的file2.qml
.
如果绑定方法不适合您——您可以使用Connections
QML Type。
在你的情况下,这段代码应该放在里面file2.qml
:
Connections {
target: obj1Id
onVar1Changed: console.log("obj1Id.var1 changed")
}
推荐阅读
- sas - SAS 如果宏内的条件未按预期工作
- azure - 将在 Azure 上托管的 asp.net 中的环境变量引用的 JSON 文件的存储位置
- linux - 应用程序只看到双处理器机器上可用线程的一半
- hyperledger-fabric - 无法启动或升级 BNA
- python - 404 用于烧瓶中的所有路线
- database - CodeIgniter:没有 www 的服务器名称不会选择正确的数据库配置
- php - 使用 zoonman/linkedin-api-php-client 从 LinkedIn API V2 获取完整的 r_basicprofile 信息
- tensorflow - Keras 报告的准确性与 model.predict() 不符
- curl - 如何将 curl --use 标志转换为在邮递员中使用
- java - Spring Data JPA - 大规模更新不起作用