Qt 将元素添加到另一个ListView中的ListView

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:

我需要在另一个ListView中的ListView中插入元素(通过QML文件中的JS代码),但当我尝试访问内部ListView时,会出现错误:

TypeError:无法调用未定义的方法“insert”

下面是显示我的问题的示例代码:

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
只创建需要显示的项,这意味着它会根据需要创建和销毁委托。这意味着如果您的项不在视图中,它将被销毁,当它返回视图时,将创建一个新的,并且旧代理项模型中的所有数据都将丢失。视图应从不存储数据,只显示数据即可


内部模型应该在外部模型内部。但是,上次我检查时,QMLs
ListModel
不支持模型嵌套,既不使用声明性语法,也不使用命令式语法。如果要嵌套模型,我提供了一个您可以使用的方法。

在哪里使用
addItem()
?我在按钮中使用它,每次按下按钮时都会调用该函数。(为了保持简单,我没有在代码中包含按钮)你必须把你需要的一切都复制到你的错误中,因为它可能很简单,但是如果你不恰当地使用它,那么它就可以产生这种错误,你必须提供一个我不知道的视图被破坏的东西。如果我把所有的数据都放在C++层中,并且每次发送一个新的项目,都会把它发送给GUI,我怎么能被冲掉呢?E用户可以查看整个列表,而不需要在列表滚动到底部时删除它,它不必是C++,它只是一个单独的数据层,它仍然可以是QML,而不是嵌套在视图内部。这样,不管GUI如何,数据都会持久。e> 要强制始终保留所有元素,但这将是低效的,并且依赖于此将是一个愚蠢的想法,只需不在视图中保留数据。视图应仅连接并显示数据层。这样,您可以没有视图,也可以同时拥有不同的视图。数据和gui应是两个完全独立的层。以下是我想做的事情:我在C++方面有事件,我必须用QML来显示它们,这样它们就按日期分组。首先,我在C++一侧做了一个事件列表,但是我不能访问QML方面的QLIST内容。为了绕过这个问题,我决定在到达的时候逐一传递事件到QML。然后将它们存储在ListModel中。它适用于简单的列表,但我无法使其适用于嵌套列表。您知道什么是解决我问题的最佳解决方案吗?您应该为外部和内部模型实现自己的
QAbstractListModel
子类。