Listmodel in QML: Como reter valores de Listmodel na página, alternar na pilha de páginas

1

Eu tenho um arquivo XML para mostrar lista de itens (listview), ao clicar em cada item que eu estou mudando para a página que lê o modelo XMLList para cada categoria usando pagestack.push.

Depois de pressionar novamente e voltar para a mesma página, os resultados perdem dados ListModel.

Como modularizar o código em vários arquivos QML sem perder as informações de dados ListModel.

Por favor, deixe-me saber.

Anexando o snippet de amostra.

main.qml

if(currentPageName == "menuName")
{
    PageStack.push(Qt.resolvedUrl("showChosenList.qml"));
}

showChosenList.qml

        ListModel{
            id: hotelMainMenuModel
        }

        XmlListModel {
            id: hotelMainMenuFetch
            source: "hotelMenu.xml"
            query: "/hotelMenu/menuCategories/categoryList/mainMenu"

            onStatusChanged: {
                if (status === XmlListModel.Ready) {
                    for (var i = 0; i < count; i++)
                    {
                        hotelMainMenuModel.append({"name": get(i).name, "displayText": get(i).name, "pageName": get(i).pageName})
                    }
                }
            }
            XmlRole { name: "name"; query: "name/string()" }
            XmlRole { name: "pageName"; query: "pageName/string()" }
        }
    }
    
por harisha 06.09.2013 / 19:19

1 resposta

2

Acredito que o seu problema é que, ao empurrar para a pilha, um nome de arquivo cria um novo objeto a cada vez, e esse novo objeto não compartilha dados com nenhum dos objetos criados anteriormente. Em vez disso, crie uma instância da página que você deseja enviar em seu arquivo QML de nível superior e insira-a na pilha de páginas sempre que quiser.

Aqui está um exemplo que espero ilustrar o que está acontecendo.

main.qml

import QtQuick 2.0
import Ubuntu.Components 0.1

MainView {
    width: units.gu(50)
    height: units.gu(75)

    PageStack {
        id: pageStack

        Page {
            id: page
            title: "Top Page"
            visible: false

            Column {
                anchors.fill: parent
                Button {
                    width: parent.width
                    text: "Open page from object"
                    onClicked: pageStack.push(subPage)
                }

                Button {
                    width: parent.width
                    text: "Open page from file"
                    onClicked: pageStack.push(Qt.resolvedUrl("SubPage.qml"))
                }
            }
        }

        SubPage {
            // This is an instance of the object declared in SubPage.qml.  All you need
            // to do to make this work is have SubPage.qml in the same directory as
            // this QML file.
            id: subPage
            visible: false
        }

        Component.onCompleted: pageStack.push(page)
    }
}

SubPage.qml

import QtQuick 2.0
import Ubuntu.Components 0.1

Page {
    title: "SubPage"

    Component.onCompleted: console.log("Made a new page")

    Button {
        width: parent.width
        property int count: 0
        text: "Clicked %1 times".arg(count)
        onClicked: count += 1
    }
}

Observe que o contador na página carregada do objeto persiste enquanto você se movimenta para frente e para trás na pilha de páginas, enquanto a página carregada do arquivo tem o contador definido como 0 sempre que é carregado. Além disso, o último registra um evento de conclusão no console toda vez, enquanto o primeiro registra isso somente quando o programa é iniciado.

    
por Robert Schroll 29.09.2013 / 03:03