Access QML StackView from a control

2019-09-18 09:50发布

Sorry for probably a stupid question - I'm very new to QML.

One of my StackView's pages:

Page
{
    id : root

    header: ToolBar
    {   
        BackButton
        {
            anchors.left: parent.left
        }
    }
}

BackButton code:

Button
{
    text: "<"
    font.pixelSize: 20
    width: 30
    onClicked: parent.root.StackView.view.pop()
}

I've tried parent.StackView also. No luck. Getting:

TypeError: Cannot call method 'pop' of null

Is there a solution?

2条回答
神经病院院长
2楼-- · 2019-09-18 09:57
  1. There is some sort of bug in Qt or Visual Studio 2015. Full rebuild is required generally after some modifications made to QML.
  2. root.StackView.view.pop() is the correct one.
查看更多
Summer. ? 凉城
3楼-- · 2019-09-18 10:06

I'd suggest something like this.

main.qml:

import QtQuick 2.6
import QtQuick.Controls 2.0

StackView {
    id: stackView
    initialItem: Page {
        header: ToolBar {
            BackButton {
                anchors.left: parent.left
                view: stackView
            }
        }
    }
}

BackButton.qml:

import QtQuick 2.6
import QtQuick.Controls 2.0

Button {
    property StackView view
    text: "<"
    font.pixelSize: 20
    width: 30
    onClicked: view.pop()
}

This way, you are not relying on an id from outside the component. Instead, you pass in the instance you want the BackButton to operate on - this is much less fragile when refactoring in the future.

查看更多
登录 后发表回答