DelegateModel QML 类型

封装一个模型和代理。 更多信息...

导入语句import QtQml.Models

属性

附加属性

方法

详细描述

DelegateModel 类型封装了一个模型以及将被实例化的代理。

通常不需要创建 DelegateModel。但是,当使用 QAbstractItemModel 的子类作为模型时,它可以用来操作和访问 modelIndex。另外,DelegateModel 也可以与 Package 一起使用,为多个视图提供代理,并与 DelegateModelGroup 一起使用以排序和过滤代理项目。

DelegateModel 仅支持一维模型——将表模型分配给 DelegateModel 和表视图将只能显示一列。

下面的示例演示了如何使用 DelegateModel 和 ListView

import QtQuick
import QtQml.Models

Rectangle {
    width: 200; height: 100

    DelegateModel {
        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
    }
}

属性说明

count : int


委托 : 组件

委托提供了一系列模板,用于定义视图实例化的每个项目。索引作为一个可访问的 index 属性暴露。根据数据模型类型,模型属性也可用。


filterOnGroup : 字符串

此属性持有用于过滤委托模型中的组的名称。

仅属于此组的项在视图中可见。

默认情况下,这是 items 组。


此属性持有委托模型中的组定义。

组定义了委托模型中项的子集,可用于过滤模型。

对于在 DelegateModel 中定义的每个组,都将为每个委托项添加两个附加的伪属性。第一个以 DelegateModel.inGroupName 的形式存在,表示项目是否属于该组;第二个 DelegateModel.groupNameIndex 持有项目在该组中的索引。

以下示例说明了如何使用组选择模型中的项。

import QtQuick
import QtQml.Models

Rectangle {
    width: 200; height: 100

    DelegateModel {
        id: visualModel
        model: ListModel {
            ListElement { name: "Apple" }
            ListElement { name: "Orange" }
        }

        groups: [
            DelegateModelGroup { name: "selected" }
        ]

        delegate: Rectangle {
            id: item
            height: 25
            width: 200
            Text {
                text: {
                    var text = "Name: " + name
                    if (item.DelegateModel.inSelected)
                        text += " (" + item.DelegateModel.selectedIndex + ")"
                    return text;
                }
            }
            MouseArea {
                anchors.fill: parent
                onClicked: item.DelegateModel.inSelected = !item.DelegateModel.inSelected
            }
        }
    }

    ListView {
        anchors.fill: parent
        model: visualModel
    }
}

警告:与正常附加属性不同,这些属性不能以声明性方式设置。以下将导致错误

delegate: Rectangle {
    DelegateModel.inSelected: true
}

items : 委托模型组

此属性持有所有新项都添加到的默认组。


model : 模型

此属性持有为 DelegateModel 提供数据的模型。

模型提供用于为视图创建项的数据集。对于大型或动态数据集,模型通常由 C++ 模型对象提供。C++ 模型对象必须是 QAbstractItemModel 子类或简单列表。

模型也可以直接在 QML 中创建,例如使用 ListModel

另请参阅 数据模型


parts : 对象

parts 属性选择一个 委托模型,它从命名部分创建委托。这与 Package 类型结合使用。

例如,以下代码从 Package 选择了创建名为 list 的委托的模型

DelegateModel {
    id: visualModel
    delegate: Package {
        Item { Package.name: "list" }
    }
    model: myModel
}

ListView {
    width: 200; height:200
    model: visualModel.parts.list
}

另请参阅 Package


persistedItems : 委托模型组

此属性持有委托模型的不失活项组。

在此组中的项在视图释放时不会被销毁,而是会持续存在,直到从组中移除。

可以通过将 DelegateModel.inPersistedItems 属性设置为 false,从失活项组中移除项目。如果此时项目没有视图引用,它将被销毁。添加项目到此组不会创建新实例。

QtQml.Models::DelegateModelGroup::create() 函数返回的项目会自动添加到此组。


rootIndex : QModelIndex

QAbstractItemModel提供了数据分层树结构,而QML仅操作列表数据。rootIndex允许为QAbstractItemModel中的任何节点的子节点提供此模型。

此属性仅影响类型为QAbstractItemModel的层叠型模型(例如,树型模型)。

例如,这里是一个简单的交互式文件系统浏览器。当点击目录名时,视图的rootIndex将被设置为点击目录的QModelIndex节点,从而更新视图以显示新目录的内容。

main.cpp:

int main(int argc, char ** argv)
{
    QApplication app(argc, argv);

    QQuickView view;

    QFileSystemModel model;
    view.rootContext()->setContextProperty("fileSystemModel", &model);

    view.setSource(QUrl::fromLocalFile("view.qml"));
    view.show();

    return app.exec();
}

view.qml:

import QtQuick
import QtQml.Models

ListView {
    id: view
    width: 300
    height: 400

    model: DelegateModel {
        model: fileSystemModel

        delegate: Rectangle {
            width: 200; height: 25
            Text { text: filePath }

            MouseArea {
                anchors.fill: parent
                onClicked: {
                    if (model.hasModelChildren)
                        view.model.rootIndex = view.model.modelIndex(index)
                }
            }
        }
    }
}

如果model是QAbstractItemModel的子类,委托也可以引用hasModelChildren属性(可选地带有model.前缀),该属性表示委托的模型项是否有任何子节点。

参阅 modelIndex()和parentModelIndex()。


附加属性文档

DelegateModel.groups : stringlist

此附加属性保存属于DelegateModelGroups的项的名称。

它附加到每个委托实例。


DelegateModel.inItems : bool

此附加属性保存项是否属于默认的items属性DelegateModelGroup

更改此属性会将项添加到或从items组中移除。

它附加到每个委托实例。


DelegateModel.inPersistedItems : bool

此附加属性保存项是否属于属性persistedItems属性DelegateModelGroup

更改此属性会将项添加到或从items组中移除。注意,从组中删除项将会销毁当前实例,如果它没有被模型引用的话。

它附加到每个委托实例。


DelegateModel.isUnresolved : bool

此附加属性指示可视化项是否绑定到数据模型索引。如果没有绑定到模型,则返回true,绑定到模型则返回false。

未解决的项可以使用DelegateModelGroup::resolve()函数绑定到数据模型。

它附加到每个委托实例。


DelegateModel.itemsIndex : int

此附加属性保存项在默认items属性DelegateModelGroup中的索引。

它附加到每个委托实例。


DelegateModel.model : model

此附加属性保存此委托实例所属的数据模型。

它附加到每个委托实例。


DelegateModel.persistedItemsIndex : int

此附加属性保存项在persistedItems属性中的索引。

它附加到每个委托实例。


方法文档

QModelIndex modelIndex(int index)

QAbstractItemModel提供了数据分层树结构,而QML仅操作列表数据。此函数协助在QML中使用树型模型。

返回指定索引的 QModelIndex。此值可以分配给 rootIndex

另请参阅 rootIndex


QModelIndex parentModelIndex()

QAbstractItemModel提供了数据分层树结构,而QML仅操作列表数据。此函数协助在QML中使用树型模型。

返回当前 rootIndex 的父级 QModelIndex。此值可以分配给 rootIndex

另请参阅 rootIndex


© 2024 Qt 公司 Ltd. 本文件中的文档贡献内容均为各自所有者的版权。本文件提供的文档遵循 GNU 自由文档许可1.3版 的条款,由自由软件基金会发布。Qt 和相关标志是芬兰和/或世界其他地区的 Qt 公司 Ltd 的 商标。所有其他商标均为其各自所有者的财产。