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()
方法编写一些包装器并将 Component
s 存储在一些单独的堆栈中:
StackView {
property var componentStack: []
function _push (x) {
push(x)
componentStack.push(x)
}
function _pop (x) {
pop(x)
return componentStack.pop()
}
}
但对我来说这看起来像是一个 hack,而且我有很多使用默认 push()
/pop()
方法的代码。还有其他解决办法吗?
创建一个组件数组,例如此处:
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
不会获得您的对象的所有权。因此,您可以直接使用对象并仍然 push/pop 多次到 StackView
.
考虑以下代码:
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
s 存储在一些单独的堆栈中:
StackView {
property var componentStack: []
function _push (x) {
push(x)
componentStack.push(x)
}
function _pop (x) {
pop(x)
return componentStack.pop()
}
}
但对我来说这看起来像是一个 hack,而且我有很多使用默认 push()
/pop()
方法的代码。还有其他解决办法吗?
创建一个组件数组,例如此处:
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
不会获得您的对象的所有权。因此,您可以直接使用对象并仍然 push/pop 多次到 StackView
.