如何解决QML:ListModel的多级菜单
我有一个示例多层ListModel:
ListModel{
id: myModel
ListElement{
name: "File"
subItems:[
ListElement{
name: "Open"
},ListElement{
name: "Open Recent"
subItems:[
ListElement{
name: "Bla.txt"
}
]
},ListElement{
name: "Save"
},ListElement{
name: "Save as"
},ListElement{
name: "Exit"
}
]
}
ListElement{
name: "Edit"
subItems:[
ListElement{
name: "Undo"
},ListElement{
name: "Redo"
},ListElement{
name: "Select All"
}
]
}
ListElement{
name: "Help"
subItems:[
ListElement{
name: "About"
}
]
}
}
我想显示为菜单。通过here,我知道如何在Menu组件内迭代模型。但是因为我具有多层结构,所以我应该检查第二层是Menu还是MenuItem。因此,我使用Loader并选择要加载的组件(检查元素的subItems
是否为undefined
):
MenuBar{
id: menuBar
Instantiator{
id: menuBarRepeater
model: myModel
onObjectRemoved: menuBar.removeItem( object )
delegate: Loader{
sourceComponent: myModel.get(index)["subItems"]? subMenuLoader : menuItemLoader
onLoaded: {
item.name = model.name;
if(myModel.get(index)["subItems"]){
item.parentIndex = index;
item.model = model
menuBar.insertMenu( index,item )
}else{
menuBar.insertItem( index,item )
}
}
}
}
}
最后,我需要为菜单的第三级添加一个实例化器。我可以递归地执行此操作,但出于示例目的,我假设我拥有最大。 3个级别。因此,将在上面的代码中加载的组件是:
Component{
id: menuItemLoader
MenuItem{
property var name
text: name
}
}
Component{
id: subMenuLoader
Menu{
id: subMenu
property var name
property var parentIndex: index
property var model
title: name
Instantiator{
model: model
onObjectRemoved: menuBar.removeItem( object )
delegate: Loader{
sourceComponent: myModel.get(parentIndex)["subItems"].get(index)["subItems"] ? subMenuLoader : menuItemLoader
onLoaded: {
item.name = model.name;
if(myModel.get(parentIndex)["subItems"].get(index)["subItems"]){
subMenu.insertMenu( index,item )
}else{
subMenu.insertItem( index,item )
}
}
}
}
}
}
我的问题是,将传递给第二级的模型是QQmlDMListAccessorData
并且不可迭代。有什么方法可以让Intantiator模型项目的孩子获得?
解决方法
因此,我发现的解决方法是:而不是将模型(类型为QQmlDMListAccessorData
)传递给subMenu
,而是将第二个Instantiator
模型用作{{1 }},其地址为myModel.get(parentIndex)["subItems"].get(index)
,对于QML,其类型为ListElement
,可以完全用作其父级(myModel本身)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。