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

时间:2018-01-26 13:34:41

标签: qt listview qml

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

  

TypeError:无法调用方法'插入'未定义的

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

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});
}

当我尝试在内部列表中插入新元素时,错误来自JS代码的最后一行。我验证了&#34; numListe&#34;的价值。是0因此它不仅仅是错误索引的问题。

如何将元素添加到内部列表?

1 个答案:

答案 0 :(得分:0)

该代码存在许多错误。

对于初学者来说 - 这是一个烂摊子,对于那些显然对这个东西很新的人来说这是一个非常糟糕的主意。保持清洁 - 无论您的专业水平如何,这都是一个好主意。

listModel_inid,因此无法在委托组件外部访问。

然而,该对象恰好绑定到视图的model属性,因此只要模型没有更改,您就可以通过listModel_in属性访问model。但是,视图本身看起来不像是委托根对象,因此您必须对其进行界面处理,例如使用alias

但是,外部模型中不存在内部模型,它只存在于外部模型的委托项中。

所以你不可能从listModel得到它。您可以从viewglobal视图中获取它,但ListView不提供索引访问权限。因此,您必须为每个索引设置currentIndex并使用currentItem

所以它看起来像这样:

viewglobal.currentItem.modelAlias.insert(0,{element_txt:item});

但不言而喻,您将数据放入GUI层,这在概念上是错误的。但它比概念错误更糟糕 - 您可能没有意识到这一点,但ListView只创建需要显示的项目,这意味着它会根据需要创建和销毁代理。这意味着如果您的项目不在视图范围内,它将被销毁,当它返回到视图时,将创建一个新项目,并且您在旧委托项目模型中拥有的所有数据将丢失< / strong>即可。该视图永远不会存储数据,只需显示它。

内部模型应该在外部模型内部。但是,上次我检查时,QML ListModel不支持模型嵌套,既不使用声明式语法也不使用命令式语法。如果你想嵌套模型,我提供了你可以使用的generic object model QML type