如何收听属性集合大小的更改

时间:2018-08-14 05:55:59

标签: qt qml

我想根据属性的集合大小自动显示/隐藏视图,这是代码:

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处理函数永远不会被调用,这是可以理解的,因为收集对象本身保持不变
那么有可能监听集合的大小变化事件吗?

2 个答案:

答案 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