Qt 将元素添加到另一个ListView中的ListView
我需要在另一个ListView中的ListView中插入元素(通过QML文件中的JS代码),但当我尝试访问内部ListView时,会出现错误: TypeError:无法调用未定义的方法“insert” 下面是显示我的问题的示例代码:Qt 将元素添加到另一个ListView中的ListView,qt,listview,qml,Qt,Listview,Qml,我需要在另一个ListView中的ListView中插入元素(通过QML文件中的JS代码),但当我尝试访问内部ListView时,会出现错误: TypeError:无法调用未定义的方法“insert” 下面是显示我的问题的示例代码: Item{ id:list width: parent.width-210 height: parent.height x:105 Component{ id:
Item{
id:list
width: parent.width-210
height: parent.height
x:105
Component{
id:listDelegate
Item {
id:elem
height: 100
width: parent.width
Item{
id:titre_liste
height: 50
width: parent.width
Text{
anchors.left: parent.left
color:"white"
text:titre_txt
font.pixelSize: 25
font.bold: false
}
}
Item{
id:listInList
width: parent.width-100
height: parent.height
Component{
id:listInListDelegate
Item{
id:element_liste
height: parent.height
width: parent.width/5
Text{
anchors.left: parent.left
color:"white"
text:element_txt
font.pixelSize: 25
font.bold: true
}
}
}
ListView {
id: viewin
anchors.fill: parent
model: ListModel{
id:listModel_in
}
delegate: listInListDelegate
}
}
}
}
ListView {
id: viewglobal
anchors.fill: parent
model: ListModel{
id:listModel
}
delegate: listDelegate
}
}
下面是我的JS代码,在QML文件的末尾:
function addItem(){
var i;
var numListe = -1;
var liste = "titre"
var item = "item"
for(i = 0;i<listModel.count;i++)
{
if(listModel.get(i).titre_txt === liste)
{
numListe = i;
}
}
if(numListe === -1)//if the list doesn't exist
{
listModel.append({titre_txt:liste});
numListe = listModel.count-1;
}
listModel.get(numListe).listModel_in.insert(0,{element_txt:item});
}
函数addItem(){
var i;
var numListe=-1;
var liste=“titre”
var item=“item”
对于(i=0;i,该代码有很多错误
首先,这是一个混乱的局面,对于一个显然是新手的人来说,这是一个非常糟糕的主意。保持它干净——不管你的专业水平如何,这总是一个好主意
中的listModel_是一个id
,因此不能在代理组件之外访问
但是,该对象恰好绑定到视图的model
属性,因此只要模型没有更改,您就可以通过model
属性访问listModel\u中的>
但是,内部模型不存在于外部模型中,它只存在于外部模型的委托项中
因此,您不可能从listModel
获取它。您可以从viewglobal
视图获取它,但是ListView
不提供索引访问。因此您必须为每个索引设置currentIndex
,并使用currentItem
所以它看起来是这样的:
viewglobal.currentItem.modelAlias.insert(0,{element_txt:item});
但是不用说,您将数据放在GUI层中,这在概念上是错误的。但它比概念上的错误更糟糕-您可能没有意识到这一点,但是ListView
只创建需要显示的项,这意味着它会根据需要创建和销毁委托。这意味着如果您的项不在视图中,它将被销毁,当它返回视图时,将创建一个新的,并且旧代理项模型中的所有数据都将丢失。视图应从不存储数据,只显示数据即可
内部模型应该在外部模型内部。但是,上次我检查时,QMLsListModel
不支持模型嵌套,既不使用声明性语法,也不使用命令式语法。如果要嵌套模型,我提供了一个您可以使用的方法。在哪里使用addItem()
?我在按钮中使用它,每次按下按钮时都会调用该函数。(为了保持简单,我没有在代码中包含按钮)你必须把你需要的一切都复制到你的错误中,因为它可能很简单,但是如果你不恰当地使用它,那么它就可以产生这种错误,你必须提供一个我不知道的视图被破坏的东西。如果我把所有的数据都放在C++层中,并且每次发送一个新的项目,都会把它发送给GUI,我怎么能被冲掉呢?E用户可以查看整个列表,而不需要在列表滚动到底部时删除它,它不必是C++,它只是一个单独的数据层,它仍然可以是QML,而不是嵌套在视图内部。这样,不管GUI如何,数据都会持久。e> 要强制始终保留所有元素,但这将是低效的,并且依赖于此将是一个愚蠢的想法,只需不在视图中保留数据。视图应仅连接并显示数据层。这样,您可以没有视图,也可以同时拥有不同的视图。数据和gui应是两个完全独立的层。以下是我想做的事情:我在C++方面有事件,我必须用QML来显示它们,这样它们就按日期分组。首先,我在C++一侧做了一个事件列表,但是我不能访问QML方面的QLIST内容。为了绕过这个问题,我决定在到达的时候逐一传递事件到QML。然后将它们存储在ListModel中。它适用于简单的列表,但我无法使其适用于嵌套列表。您知道什么是解决我问题的最佳解决方案吗?您应该为外部和内部模型实现自己的QAbstractListModel
子类。