本页内容

SortFilterProxyModel QML Type

为QAbstractItemModel 提供排序和筛选功能。更多内容...

Import Statement: import QtQml.Models
Since: Qt 6.10
Status: Technology preview

此类型处于技术预览阶段,可能会有变动。

属性

方法

详细说明

SortFilterProxyModel 继承自QAbstractProxyModel ,该类负责将源索引转换为代理索引。排序和过滤通过sorters 和filters 属性进行控制,这些属性决定了QML中指定的执行顺序。可以通过每个排序器可用的priority属性覆盖该顺序。默认情况下,所有排序器具有相同的优先级。

SortFilterProxyModel 允许用户对QAbstractItemModel 进行排序和过滤。诸如TableView 或TreeView 之类的项目视图可以利用此代理模型来显示经过过滤的内容。

注意:目前 ,SortFilterProxyModel 仅支持将QAbstractItemModel 作为源模型。

下面的代码片段展示了 QML SortFilterProxyModel 中排序器和过滤器的配置:

ProcessModel { id: processModel }

SortFilterProxyModel {
    id: sfpm
    sourceModel: processModel
    sorters: [
        RoleSorter {
            roleName: "user"
            priority: 0
        },
        RoleSorter {
            roleName: "pid"
            priority: 1
        }
    ]
    filters: [
        FunctionFilter {
            function filter(cpuUsage: real) : bool {
                return (cpuUsage > 90)
            }
        }
    ]
}

每当源模型中的数据发生变化时,SortFilterProxyModel 都会动态对数据进行排序和过滤,并可通过dynamicSortFilter 属性将其禁用。

可在 SortFilterProxyModel 中配置排序器RoleSorter 、StringSorter 和FunctionSorter 。每个排序器均可通过column 属性配置特定的列索引。 如果未指定列索引,则默认对模型的列索引 0 进行排序。可以通过priority 属性修改排序器的执行顺序。这在执行分层排序时特别有用,例如先对第一列的数据进行排序,然后对后续列应用排序。

要禁用特定的排序器,可将 `enabled ` 设置为 `false`。

还可以通过调用setPrimarySorter() 方法设置主排序器来覆盖排序器的优先级。当模型中还配置了其他排序器时,如果视图希望通过点击列标题(如TableView 所示)对特定列的数据进行排序,此方法将非常有用。

过滤器ValueFilter 和FunctionFilter 可在 SortFilterProxyModel 中进行配置。与排序器类似,每个过滤器均可通过column 属性进行设置,以过滤特定列中的数据。如果未指定列,则过滤器将应用于模型中的所有列索引。 为减少过滤过程中不必要的检查开销,建议指定列索引。

若要禁用特定过滤器,可将enabled 设置为false 。

ListModel {
    id: listModel
    ListElement { name: "Adan"; age: 25; department: "Process"; pid: 209711; country: "Norway" }
    ListElement { name: "Hannah"; age: 48; department: "HR"; pid: 154916; country: "Germany" }
    ListElement { name: "Divina"; age: 63; department: "Marketing"; pid: 158038; country: "Spain" }
    ListElement { name: "Rohith"; age: 35; department: "Process"; pid: 202582; country: "India" }
    ListElement { name: "Latesha"; age: 23; department: "Quality"; pid: 232582; country: "UK" }
}

SortFilterProxyModel {
    id: ageFilterModel
    sourceModel: listModel
    filters: [
        AgeFilter { }
    ]
    sorters: [
        RoleSorter { roleName: "department" }
    ]
}

ListView {
    anchors.fill: parent
    clip: true
    model: ageFilterModel
    delegate: Rectangle {
        implicitWidth: 100
        implicitHeight: 50
        border.width: 1
        Text {
            text: name
            anchors.centerIn: parent
        }
    }
}

上述代码片段中的 AgeFilter 可声明如下

FunctionFilter {
   function filter(age: int) : bool {
      return age > 30
   }
}

注意:此 API 目前处于技术预览阶段,在未来的 Qt 版本中可能会发生变更或被移除。

属性文档

autoAcceptChildRows : bool

此属性不会过滤掉已接受行下的子行。其行为与QSortFilterProxyModel 中的 autoAcceptChildRows 类似。

默认值为false 。

dynamicSortFilter : bool

该属性用于指定当源模型的内容发生变化时,代理模型是否会动态进行排序和过滤。

默认值为true 。

filters : list<FilterBase>

该属性存储了SortFilterProxyModel 的过滤器列表。如果未设置优先级,SortFilterProxyModel 将按照列表中指定的顺序应用过滤器。

recursiveFiltering : bool

此属性允许将所有已配置的过滤器递归地应用于子节点。其行为与QSortFilterProxyModel 中recursiveFilteringEnabled 的行为类似。

默认值为false 。

sorters : list<Sorter>

该属性存储了SortFilterProxyModel 的排序器列表。如果未设置优先级,SortFilterProxyModel 将按照列表中指定的顺序应用排序器。

sourceModel : var

此属性用于设置排序过滤器代理模型的源模型。其值应为QAbstractItemModel 类型。

方法文档

void invalidate()

该方法通过重新评估源模型数据上的配置过滤器和排序器,使模型失效。

void invalidateSorter()

此方法会强制排序过滤器代理模型根据数据重新评估已配置的排序器。当通过属性禁用动态排序时,可以使用此方法。dynamicSortFilter

void setPrimarySorter(sorter)

此方法用于在排序过滤器代理模型中设置主排序器。主排序器将在sorter 属性中配置的所有其他排序器之前进行评估。如果未进行配置或未传递null ,则优先级更高的排序器将被视为主排序器。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.