StackView:存储组件及其项目

时间:2015-09-17 08:44:59

标签: qt qml qtquick2

请考虑以下代码:

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()方法编写一些包装器,并将Component存储在一个单独的堆栈中:

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

但对我而言,它看起来像是黑客,我也有很多使用默认push() / pop()方法的代码。还有其他解决方案吗?

1 个答案:

答案 0 :(得分:0)

  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})
    
  3. 通过执行这两个步骤,StackView不会取得您对象的所有权。因此,您可以直接使用对象并仍然多次推送/弹出StackView