QML 中的 Listmodel:如何在页面堆栈中的页面切换时保留 Listmodel 值

QML 中的 Listmodel:如何在页面堆栈中的页面切换时保留 Listmodel 值

我有一个 XML 文件来显示项目列表 (listview),单击每个项目时,我都会切换到使用 pagestack.push 读取每个类别的 XMLListmodel 的页面。

按下“返回”并再次返回同一页面后,会导致 ListModel 数据丢失。

如何将代码模块化为多个 QML 文件而不丢失 ListModel 数据信息。

请告诉我。

附上示例片段。

主文件

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

显示选择列表.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()" }
        }
    }

答案1

我认为您的问题是每次将文件名推送到堆栈都会创建一个新对象,并且这个新对象不会与任何先前创建的对象共享数据。相反,请在顶层 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)
    }
}

子页面.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
    }
}

请注意,从对象加载的页面的计数器在页面堆栈中来回移动时保持不变,而从文件加载的页面每次加载时计数器都会设置为 0。此外,后者每次都会将完成事件记录到控制台,而前者仅在程序启动时记录此事件。

相关内容