SortFilterProxyModel QML Type
Import Statement: | import QtQml.Models |
Since: | Qt 6.10 |
Status: | Preliminary |
此类型正在开发中,可能会有更改。
属性
- autoAcceptChildRows : bool
- dynamicSortFilter : bool
- filters : list<Filter>
- model : var
- recursiveFiltering : bool
- sorters : list<Sorter>
方法
- invalidate()
- invalidateSorter()
- setPrimarySorter(sorter)
详细说明
SortFilterProxyModel 继承自QAbstractProxyModel ,它处理源索引到代理索引的转换。排序和过滤是通过sorters 和filters 属性控制的,它们决定了 QML 中指定的执行顺序。可使用每个分拣器的优先级属性来重写该顺序。默认情况下,所有分拣器共享相同的优先级。
SortFilterProxyModel 使用户能对QAbstractItemModel 进行排序和过滤。项目视图(如TableView 或TreeView )可利用此代理模型来显示过滤后的内容。
注: 目前,SortFilterProxyModel 仅支持QAbstractItemModel 作为源模型。
下面的代码段显示了 QML SortFilterProxyModel 中分类器和过滤器的配置:
ProcessModel { id: processModel } SortFilterProxyModel { id: sfpm model: processModel sorters: [ RoleSorter: { roleName: "user" priority: 0 }, RoleSorter: { roleName: "pid" priority: 1 } ] filters: [ FunctionFilter: { component RoleData: QtObject { property qreal cpuUsage } function filter(data: RoleData) : bool { return (data.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 model: listModel filters: [ FunctionFilter { roleData: QtObject { property int age } function filter(data: QtObject) : bool { return data.age > 30 } } ] 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 } } }
注意: 此 API 属于技术预览版,可能会在未来的 Qt 版本中更改或删除。
属性文档
autoAcceptChildRows : bool |
该属性不会过滤掉已接受行的子行。其行为类似于QSortFilterProxyModel 中的 autoAcceptChildRows。
默认值为false
。
dynamicSortFilter : bool |
当源模型的内容发生变化时,该属性将决定是否对代理模型进行动态排序和过滤。
默认值为true
。
该属性保存SortFilterProxyModel 的过滤器列表。如果未设置优先级,SortFilterProxyModel 将按照列表中指定的顺序应用过滤器。
model : var |
此属性允许为排序过滤器代理模型设置源模型。
recursiveFiltering : bool |
该属性允许将所有已配置的筛选器递归应用于子节点。其行为类似于QSortFilterProxyModel 中的 recursiveFilteringEnabled。
默认值为false
。
该属性保存SortFilterProxyModel 的分拣器列表。如果未设置优先级,SortFilterProxyModel 将按照列表中指定的顺序应用分拣器。
方法文档
invalidate() |
此方法通过重新评估源模型数据上配置的筛选器和排序器使模型失效。
invalidateSorter() |
此方法强制排序筛选器代理模型根据数据重新评估配置的排序器。它可用于通过属性禁用动态排序的情况。dynamicSortFilter
setPrimarySorter(sorter) |
该方法允许在排序筛选器代理模型中设置主排序器。主要排序器将先于作为sorter 属性一部分配置的所有其他排序器进行评估。如果未配置或通过null
,则优先级较高的分拣器将被视为主分拣器。
© 2025 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.