DelegateModel
ImportStatement: import QtQml.Models 2.0
Properties
count : int
delegate :Component
filterOnGroup: string
groups :list<DelegateModelGroup>
items :DelegateModelGroup
model :model
parts :object
persistedItems: DelegateModelGroup
rootIndex :QModelIndex
AttachedProperties
inItems :int
inPersistedItems: int
isUnresolved: bool
itemsIndex :int
persistedItemsIndex: int
Methods
QModelIndexmodelIndex(int index)
QModelIndexparentModelIndex()
DetailedDescription
组件封装一个模型。delegate(一直找不到合适的词,个人觉得漫画中的具像放在这里是神解释,以后都叫具像了)在模型中实例化。
创建一个DelegateModel常常是不必要的。当一个QAbstractItemModel子类被作为模特使用时,它能用来访问模特索引。另外,DelegateModel和Package一起使用,可提供多种显示,还可以使用DelegateModelGroup来排序和过滤。
下面的例子展示了在ListView中使用DelegateModel。
importQtQuick 2.0
Rectangle {
width: 200; height: 100
VisualDataModel {
id: visualModel
model: ListModel {
ListElement { name:"Apple" }
ListElement { name:"Orange" }
}
delegate: Rectangle {
height: 25
width: 100
Text { text: "Name: " +name}
}
}
ListView {
anchors.fill: parent
model: visualModel
}
}
注意,因为兼容的原因,在Qt QML模块中,这个组件也可用作VisualDataModel。
PropertyDocumentation
count : int
模特的列表中的模特数目。原版英文没有关于此的介绍,这是实测的试验结果。
delegate :Component
具像提供了定义每个模特显示实例的模板组件。索引为公开的可访问的索引属性。根据模特的类型,可以访问模特的属性。
filterOnGroup: string
用于过滤可见的数据模型的组的名字。组中的数据可见。
groups :list<DelegateModelGroup>
组列表。Groups定义了用于在具像模型中过滤的子集。每一个组都有两个关联属性与具像的实例相关联,第一个属性可通过DelegateModel.inGroupName访问,用来判断具像实例是不是在组里,第二个属性可通过DelegateModel.groupNameIndex访问,如果具像实例在组里,则是其在组中的索引。
下面的代码展示了组的应用:
首先定义了"selected"的组,在delegate中,item.VisualDataModel.inSelected用来判断具像实例是不是属于"selected"组。item是具像组件的id,VisualDataModel等效于DelegateModel,inSelected就是组名的第一个字母大写后添加前缀in。如果为真,则表示在组里。item.VisualDataModel.selectedIndex与之类似,使用selectedIndex访问具像实例在组里的索引号。
模特列表ListModel中的每一个模特元件,都在delegate指向的模板中显示。每个模特元件的显示实例,就是我们前面说的具像实例。
我们可以定义多个组,注意下面的中括号。VisualDataGroup是一个组件,我们以后会慢慢介绍。VisualDataModel也会在以后的文章中作为一个组件介绍。
importQtQuick 2.0
Rectangle {
width: 200; height: 100
VisualDataModel {
id: visualModel
model: ListModel {
ListElement { name: "Apple" }
ListElement { name:"Orange" }
}
groups: [
VisualDataGroup { name:"selected" }
]
delegate: Rectangle {
id: item
height: 25
width: 200
Text {
text: {
var text = "Name:" + name
if(item.VisualDataModel.inSelected)
text += " ("+ item.VisualDataModel.selectedIndex + ")"
return text;
}
}
MouseArea {
anchors.fill: parent
onClicked:item.VisualDataModel.inSelected = !item.VisualDataModel.inSelected
}
}
}
ListView {
anchors.fill: parent
model: visualModel
}
}
items :DelegateModelGroup
可见模特的默认组,所有新添加的模特,都放在这个组里。
model :model
向DelegateModel提供数据的模特列表。模特列表的成员为关联的显示实例提供设置数据。巨大和动态的模特列表,常常是C++的模特对象。C++的模特对象必须是一个简单的列表或QAbstractItemModel的子类。模特列表也能使用ListModel或XmlListModel在QML中直接创建。
parts :object
当我们使用Package组件定义delegate时,我们可以在Package中定义多个Item。每个Item我们可以给它Package.name的关联属性,该属性为这个Item的部件名。我们可以通过访问DelegateModel的parts属性,通过指定部件名来访问这个部件。如此可以让我们DelegateModel中的模特列表中的模特,以多种方式显示。
parts需要和Package组件一起使用。
下面的例子简单的展示了使用这个属性的方法:
DelegateModel{
id: visualModel
delegate: Package {
Item { Package.name: "list" }
}
model: myModel
}
ListView {
width: 200; height:200
model: visualModel.parts.list
}
persistedItems: DelegateModelGroup
可视化坚挺组。模特列表的模特在显示的时候会创建具像实例,而它不显示的时候,具像实例会被摧毁。如果实例是在这个组里,那么在它从这个组移除之前,被view释放,也不会被摧毁。具像实例的DelegateModel.inPersistedItems属性设置成假,可将具像实例从这个组移除。将具像实例添加入这个组,不会创建新实例。通过QtQml.Models::DelegateModelGroup::create()创建的具像实例,会被直接添加入这个组。
rootIndex :QModelIndex
QAbstractItemModel提供了数据的树型结构,而QML只能操作链表数据。rootIndex允许QAbstractItemModel中任何节点的子数据被提供给这个model。rootIndex只对QAbstractItemModel的树形数据模特列表有影响。
下面是文件系统浏览器的代码,当目录名被点击,rootIndex被设置成点击目录的QModelIndex节点,这样view就能显示新目录的内容。
main.cpp:
int main(intargc, char ** argv)
{
QApplication app(argc, argv);
QQuickView view;
QDirModel model;
view.rootContext()->setContextProperty("dirModel",&model);
view.setSource(QUrl::fromLocalFile("view.qml"));
view.show();
return app.exec();
}
view.qml:
import QtQuick2.0
ListView {
id: view
width: 300
height: 400
model: VisualDataModel {
model: dirModel
delegate: Rectangle {
width: 200; height: 25
Text { text: filePath }
MouseArea {
anchors.fill: parent
onClicked: {
if (model.hasModelChildren)
view.model.rootIndex =view.model.modelIndex(index)
}
}
}
}
}
如果模特模型是QAbstractItemModel的子类,具像也能引用hasModelChildren属性(通过model.前缀选择合适的)判断具像实例是否有子节点可供使用。
AttachedProperty Documentation
.inItems :int
具像实例是否属于items组。改变这个属性能将具像实例从该组中加入或删除。它与每个具像实例关联。
.inPersistedItems: int
具像实例是否属于persistedItems组,改变这个属性能将具像实例从该组中加入或删除。注意如果从该组中移除,而具像实例又没有被模型引用的化,该具像实例将被摧毁。
这个属性关联所有的具像实例。
.isUnresolved: bool
可见的具像实例是否绑定到模特模型索引。如果没有,则返回真,否则返回假。
一个未绑定的具像实例能使用DelegateModelGroup::resolve()功能绑定。它和所有的具像实例关联。
.itemsIndex: int
具像实例在组items中的索引。它与所有具像实例关联。
.persistedItemsIndex: int
具像实例在组persistedItems中的索引,它与所有的具像实例关联。
MethodDocumentation
QModelIndexmodelIndex(int index)
QAbstractItemModel提供了树型数据,但QML只处理列表数据,这个方法协助QML处理树模型。它返回指定索引的QModelIndex,这个值能被分配给rootIndex。
QModelIndexparentModelIndex()
QAbstractItemModel提供了树型数据,但QML只处理列表数据,这个方法协助QML处理树模型。它返回当前rootIndex的父索引的QModelIndex,这个值能被分配给rootIndex。