首页 > 解决方案 > 如何从 XMLListModel 中的属性在动态组件中创建动态和不同的对象?

问题描述

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

元素.xml

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

页面.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 中。但我不知道该怎么做。

标签: xmlqtgridviewdynamicqml

解决方案


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

从video.qmlimage.qml创建组件对象,它们将用作代表。添加了一个额外的组件 (compPlaceHolder) 用于处理错误类型。

Component{ id: compVideo; Videos{}}

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

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

对于 GridView 的委托,您可以使用 Loader 组件,该组件将根据模型中的 'type' 属性动态加载组件compVideocompImagecompPlaceHolder 。

Loader{
    sourceComponent: assignDel()

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

推荐阅读