这很奇怪,因为我在另一个QML文件中使用了几乎相同的模式,它可以正常工作!我敢肯定,我不会在任何地方重新分配 Value (我知道的唯一可以使属性保持静态)!我有这样的东西(这是一个简化的例子,可能按预期工作):
Item {
property bool isExpanded: false
MouseArea {
anchors.fill: parent
onClicked: {
isExpanded = !isExpanded
console.log(isExpanded)
console.log(myId.visible)
}
}
MyCustomItem {
id: myId
visible: isExpanded
// other stuff
}
}
单击后 IsExpanded
更改但 Item
可见性始终保持不变!我的项目有许多其他属性(例如 height: isExpanded ? someval : 0
)也没有改变!如果我总是手动更改所有内容,但它有什么用呢?在另一个QML中,我使用了类似的模式,它在那里工作!
BUT! 如果我放,例如 onDoubleClicked
/另一个按钮按下: myId.visible = Qt.binding(function() {return isExpanded})
它可以正常工作!所以,由于某些未知的原因,它不应该在常规属性声明( visible: isExpanded
)中绑定它们 .
所以问题是,我是否真的需要明确告诉Qt绑定属性以使其工作?
Edit: 要说清楚:我'm certain I don' t在任何地方重新分配可见属性 . 我做了检查 . 虽然qml大小只有大约100行我使用ctrl f找到任何可见的提及,但除了已经提到的以外没有找到 . 如果有更可靠的方法来告诉/检查某些地方或某事可能的重新分配,请告诉我们 .
2 回答
是 .
声明属性时,您可以使用绑定语法,例如
visible: isExpanded
. 但是,使用常规JavaScript语法(即赋值运算符)在命令式代码中设置属性将破坏任何现有绑定并覆盖属性的值 . 如果要在命令式代码中显式设置属性绑定,请使用Qt.binding()
方法(docs) .虽然您的实际问题是由于受到QML范围规则的影响而受到影响 . 您的
MyCustomItem
类型具有isExpanded
属性,因此在您声明时:你实际上是绑定
visible
到MyCustomItem::isExpanded
. 因此,要明确指出您所指的是哪个isExpanded
:我发现了这个问题!非常不明显(没有在任何地方找到记录),它无声地失败 . 问题是
MyCustomItem
包含一个具有相同名称的外部booleal属性isExpanded
的属性,因此在此代码中:isExpanded
来自MyCustomItem
. 但没有任何迹象 . 好吧,现在我知道这可能会发生,如果它再次发生可能会发现它,但这确实是违反直觉的 . 如果它不是't my item but someone else'并且我没有至少警告可能的含糊不清 .