Alexander Dyagilev
Alexander Dyagilev

Reputation: 1425

Access QML StackView from a control

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?

Upvotes: 0

Views: 1676

Answers (2)

Robin Burchell
Robin Burchell

Reputation: 881

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.

Upvotes: 2

Alexander Dyagilev
Alexander Dyagilev

Reputation: 1425

  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.

Upvotes: 1

Related Questions