StackView:存储组件及其项目

StackView: storing components along with their items

考虑以下代码:

StackView {
    id: stack
}

Component {
    id: componentFooBar
    FooBar {}
}
...
stack.push({item: componentFooBar})

在上面的示例中,根据 Qt 源代码和文档,在 componentFooBar 被推入堆栈后,其内部项 (FooBar) 被加载并推入内部堆栈的顶部.如果我想访问堆栈头(通过 pop()get(0)),我将获得 FooBar 实例,而不是它的 Component。所以对于 Qml StackView 没有像

这样的不变量
stack.push(X)
X === stack.pop()

有什么方法可以访问推送的 Component 吗?我现在唯一的想法是为 push()/pop()/get() 方法编写一些包装器并将 Components 存储在一些单独的堆栈中:

StackView {
    property var componentStack: []
    function _push (x) {
        push(x)
        componentStack.push(x)
    }
    function _pop (x) {
        pop(x)
        return componentStack.pop()
    }
}

但对我来说这看起来像是一个 hack,而且我有很多使用默认 push()/pop() 方法的代码。还有其他解决办法吗?

  1. 创建一个组件数组,例如此处:

    StackView {
       id: stackView
    }
    
    property variant myObjects: [component1.createObject(), component2.createObject(), component3.createObject()] 
    
    Component {
       id: component1
    }
    
    Component {
       id: component2
    }
    
    Component {
       id: component3
    }
    
  2. 然后在推送到 StackView 时确保使用 destroyOnPop 属性:

    stackView.push({item: myObjects[componentIndex], destroyOnPop: false})
    

通过执行这两个步骤,StackView 不会获得您的对象的所有权。因此,您可以直接使用对象并仍然 push/pop 多次到 StackView.