QML类型说明-DelegateModel

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。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值