如何访问包含QML StackView的内容?

时间:2018-06-25 08:56:38

标签: qt qml

我是QML的新手,我有一个被推入StackView的组件。我希望从此组件访问包含它的StackView。

这是一个有效的代码

import QtQuick 2.11
import QtQuick.Controls.2.2

ApplicationWindow {
    id: window

    StackView {
        id: stackView
        initialItem: test1
        anchors.fill: parent
    }
    Component {
        id: test1
        Button {
            text: "Go to test2"
            onClicked: stackView.push(test2)
        }
    }
    Component {
        id: test2
        Button {
            text: "Back to test1"
            onClicked: stackView.pop()
        }
    }
}

但是,我想避免通过其stackView访问id

Stack.view似乎是我想要的,但是我不知道如何使用它。我尝试了以下所有操作(替换了Button s'onClicked):

Stack.view.push(test2)
view.push(test2)
test1.Stack.view.push(test2)
test1.view.push(test2)

这些都不起作用。 我误会了吗?我应该如何使用Stack.view

编辑:这个问题看起来真的很接近我:Access QML StackView from a control

我确实可以使用属性来保留对我的StackView的引用,但是如果可能的话,我仍然希望避免这种情况。 接受的答案表明root.StackView.view.pop()是正确的方法。我假设root是本文中Page的{​​{1}},所以我尝试了id,但这仍然行不通。 (也尝试过使用test1.StackView.view.push(test2),但这并不更好)

1 个答案:

答案 0 :(得分:1)

  

请注意,此问题是关于QtQuick.Controls 2.x的。

我还认为,先使用附加属性,而不是通过添加自己的自定义属性来使此功能加倍,是一种很好的样式。

问题是,您在错误的位置使用了附加属性-它附加到被推到Item上的StackView上,而不附加到它的任何子元素上。因此,要使用附加的属性,您需要首先指定该Item的标识符。

在示例中,该链接已链接为root。但这不是id对象的Component。它必须是Component对象内容的根节点。

您应该具有以下内容:

Component {
    id: myComponent
    Item { // The Page. To this the attached property will be attached.
        id: myComponentRoot // Use this to identify the root node of the pushed item.
        Item { // Some more layers ...
        ...
            Button { // Here you now want to access it perhaps?
                onClicked: myComponentRoot.StackView.view.pop() // Reference the root node of the component to access it's attached properties.
            }
        }
    }
}