我想根据属性的集合大小自动显示/隐藏视图,这是代码:
QtObject {
property var controlWindow: Window {
property var collection: []
signal sigAddElement(var element)
onSigAddElement: {
collection.push(element)
}
signal sigEraseAllElements()
onSigEraseAllElements: {
collection.length = 0
}
onCollectionChanged: {
console.log("collection.len = " + collection.length)
}
Rectangle {
id: autoHidableView
visible: collection.length != 0
}
}
}
但是visible
的{{1}}属性在启动时只评估一次,而从不再次评估
autoHidableView
处理函数永远不会被调用,这是可以理解的,因为收集对象本身保持不变
那么有可能监听集合的大小变化事件吗?
答案 0 :(得分:1)
仅听取数组长度是不够的。 参见var QML Basic Type:
请务必注意,分配给var属性的JavaScript对象的常规属性的更改将不会触发访问它们的绑定的更新。
将数组分配给var时的行为相同。仅当用整个新对象/数组重新分配属性时,绑定才会重新评估。
您可以通过两种方法使绑定监听集合长度的变化:
重新分配整个阵列:
onSigAddElement: {
collection = collection.concat(element)
}
// ...
onSigEraseAllElements: {
collection = []
}
手动触发更改信号:
onSigAddElement: {
collection.push(element)
collectionChanged()
}
// ...
onSigEraseAllElements: {
collection.length = 0
collectionChanged()
}
答案 1 :(得分:1)
问题在于,用property var collection: []
创建的javascript数组没有任何信号(实际上onCollectionChanged
是您要为其分配新集合时的信号)。您最好使用ListModel:
QtObject {
property var controlWindow: Window {
ListModel {
id: collection
}
signal sigAddElement(var element)
onSigAddElement: {
collection.append(element)
}
signal sigEraseAllElements()
onSigEraseAllElements: {
collection.clear()
}
Rectangle {
id: autoHidableView
visible: collection.count > 0
}
}
}
请注意,您需要将push
更改为append