2017-02-21 140 views
2

是否可以使用DelegateModel创建QML项目?使用DelegateModel创建QML项目

下面是一个例子DelegateModel:

DelegateModel 
{ 
    id: delegateModel 
    model: ListModel 
    { 
     ListElement { name: "#FAFAFA"; test: "object1" } 
     ListElement { name: "#000000"; test: "object2" } 
    } 
    delegate: Rectangle 
    { 
     objectName: test 
     width: 50 
     height: 50 
     color: name 
    } 
    Component.onCompleted: 
    { 
     Utils.var_dump(items,3) 
     items.create(0) 
     Utils.var_dump(items.get(0),3) 
    } 
} 

的结果应该是这样的:

Rectangle 
{ 
    objectName: "object1" 
    width: 50 
    height: 50 
    color: "#FAFAFA" 
} 
Rectangle 
{ 
    objectName: "object2" 
    width: 50 
    height: 50 
    color: "#000000" 
} 

对于每一个ListElement有与插入的ListElement数据创建的委托。

回答

1

你可以做到这一点与任何可用来实例化一个Model(一View

例如,你可以使用它作为一个模型为ListView,一个GridViewRepeater。由于模型自己提供委托,因此您无需指定View中的任何委托,即可将其实例化。

Column { 
    Repeater { 
     model: delegateModel 
     // delegate: ... <--- Nothing here! Uses the delegate from the Model. 
    } 
} 

如果使用create(index) - 方法,委托将被创建,但没有父,所以它不会显示。所以,你需要设置父,要把它显示:

Button { 
    onClicked: { 
     for (var a = 0; a < dm.items.count; a++) { 
      var o = dm.items.create(a) 
      o.parent = r 
     } 
    } 
} 

你需要知道的是,DelegateModel(不PackageParts)不能在多个视图中使用,因为每个条目/委托可以只能同时实例化一次。如果您想要的话, 可以考虑使用QSortFilterProxyModel来过滤这些内容,并尽可能多地使用提供他们自己委托的Views