请考虑以下代码:
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()
方法的代码。还有其他解决方案吗?
答案 0 :(得分:0)
创建组件数组,例如:
StackView {
id: stackView
}
property variant myObjects: [component1.createObject(), component2.createObject(), component3.createObject()]
Component {
id: component1
}
Component {
id: component2
}
Component {
id: component3
}
然后在推送到StackView
时确保使用destroyOnPop
属性:
stackView.push({item: myObjects[componentIndex], destroyOnPop: false})
通过执行这两个步骤,StackView
不会取得您对象的所有权。因此,您可以直接使用对象并仍然多次推送/弹出StackView
。