如何通过XMLListModel中的属性在动态组件中创建动态对象和不同对象?

问题描述

我从文件Page.qml动态创建了一个页面,对此没有问题。 在此文件中,我有一个XMLListModel,它从该XML文件获取标签

elements.xml

<element>First
    <type>Video</type>
    <source>videos.mp4<source>
</element>
<element>Second
    <type>Image</type>
    <source>image.jpg</source>
</element>

Page.qml

...
Page
{
  XMLListModel
  {
    id:xmlmodel
    source:"elements.xml"
    query:"/element"
    XmlRole
    {
      name:"type"; query:"type/string()"
    }
    XmlRole
    {
      name:"source"; query:"type/source()"
    }
...}

我要在javascript中创建一个函数,其中:

  1. 我可以像传递XmlListModel类型和源一样传递参数;
  2. 在相对qml文件(videos.qml,image.qml)中的qml创建对象类型和源之间进行切换的开关,以像添加属性一样
  3. 如果可能的话,我想将此对象放在GridView中。 但我不知道该怎么办。

解决方法

您可以将 xmlmodel 分配给GridView的模型属性。

video.qml image.qml 创建组件对象,这些对象将用作委托。添加了用于处理错误类型的额外组件(compPlaceHolder)。

Component{ id: compVideo; Videos{}}

Component{ id: compImage; id: Image{}}

Component{ id: compPlaceHolder; id: Item{}}

对于GridView的委托,您可以使用Loader组件,该组件将根据以下参数动态加载组件 compVideo compImage compPlaceHolder 。模型中的“类型”属性。

Loader{
    sourceComponent: assignDel()

    function assignDel(){
        if(type == "Video"){ return compVideo; }
        else if(type == "Image"){ return compImage; }
        else{ return compPlaceHolder; }
    }
}