我有一个 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。此外,后者每次都会将完成事件记录到控制台,而前者仅在程序启动时记录此事件。