这很奇怪,因为我在另一个QML文件中使用了几乎相同的模式,它运行正常!我敢肯定,我不会在任何地方重新分配价值(我知道的唯一可以使属性保持静态)! 我有这样的东西(这是一个简化的例子,可能按预期工作):
SELECT DISTINCT a.Id_972 Id,
a.Datum_972 Date,
a.Omschrijving_972 Title,
a.Bedrag_972 Amount,
b.OmschrN_977 Type,
c.OmschrKN_976 Project,
d.Status_975 Status
FROM WebOnkosten_972 AS a,
WebOnkostenType_977 AS b,
WebOnkostenProject_976 AS c,
WebOnkostenToestand_975 AS d
WHERE a.Type_972 = b.Type_977' AND
a.Project_972 = c.ProjectNR_976 AND
a.Id_972 = d.IdOnkost_975
点击后 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
),它们也没有变化!如果我总是手动更改所有内容,但它有什么用呢?在另一个QML中,我使用了类似的模式,并且在那里工作!
但是!如果我放了,例如height: isExpanded ? someval : 0
/另一个按钮,请按:
onDoubleClicked
它应该工作!所以,由于某些未知的原因,它不应该在常规属性声明(myId.visible = Qt.binding(function() {return isExpanded})
)中“绑定”它们。
所以问题是,我真的需要明确告诉Qt绑定属性以使其工作吗?
编辑:要明确:我确定我不会在任何地方重新分配可见属性。我做了检查。虽然qml大小只有大约100行,但我使用ctrl + f查找任何可见的提及,除了已经提到的以外没有找到。 如果有更可靠的方法来告诉/检查某些地方或某事可能的重新分配,请告诉我们。
答案 0 :(得分:2)
所以问题是,我真的需要明确告诉Qt绑定属性以使其工作吗?
是
声明属性时,您可以使用绑定语法,例如visible: isExpanded
。但是,使用常规JavaScript语法(即赋值运算符)在命令式代码中设置属性将破坏任何现有绑定并覆盖属性的值。如果要在命令式代码中显式设置属性绑定,请使用Qt.binding()
方法(docs)。
虽然您的实际问题是由于受到QML范围规则的影响而受到影响。您的MyCustomItem
类型具有isExpanded
属性,因此当您声明:
MyCustomItem {
id: myId
visible: isExpanded
// other stuff
}
您实际上是将visible
绑定到MyCustomItem::isExpanded
。因此,要明确指出您所指的isExpanded
:
Item {
id: base
property bool isExpanded: false
MouseArea {
anchors.fill: parent
onClicked: {
isExpanded = !isExpanded
console.log(isExpanded)
console.log(myId.visible)
}
}
MyCustomItem {
id: myId
visible: base.isExpanded
// other stuff
}
}
答案 1 :(得分:0)
我发现了这个问题!非常不明显(在任何地方找不到任何记录)并且它无声地失败。
问题是MyCustomItem
包含一个与外部booleal属性isExpanded
具有相同名称的属性,因此在此代码中:
MyCustomItem {
id: myId
visible: isExpanded
// other stuff
}
isExpanded
来自MyCustomItem
。但没有任何迹象。好吧,现在我知道这可能会发生,如果它再次发生可能会发现它,但这确实是违反直觉的。如果它不是我的项目而是其他人,而且我不知道它有这样的财产怎么办? Qt创建者至少可以警告可能的含糊不清。