模型建数据传递QSortFilterProxyModel
QSortFilterProxyModel类支持对在另一个模型和视图之间传递的数据进行排序和筛选。
from PySide6.QtCore import QSortFilterProxyModel
QSortFilterProxyModel(parent: Union[PySide6.QtCore.QObject, NoneType] = None)-> None
QSortFilterProxyModel官方描述
QSortFilterProxyModel可用于对项目进行排序、筛选出项目,或两者兼而有之。模型通过将其提供的模型索引映射到对应于不同位置的新索引,以供视图使用,从而转换源模型的结构。就视图而言,这种方法允许重构给定的源模型,而不需要对底层数据进行任何转换,也不需要在内存中复制数据。
让我们假设我们想要对自定义模型提供的项进行排序和筛选。在不进行排序和筛选的情况下,用于设置模型和视图的代码如下所示:
treeView = QTreeView()
要为MyItemModel添加排序和筛选支持,我们需要创建一个QSortFilterProxyModel,以MyItemModel为参数调用setSourceModel(),并在视图上安装QSortFilterProxy:
treeView = QTreeView() sourceModel = MyItemModel(self)
proxyModel = QSortFilterProxyModel(self)
proxyModel.setSourceModel(sourceModel)
treeView.setModel(proxyModel)
此时,既不启用排序,也不启用筛选;原始数据显示在视图中。通过QSortFilterProxyModel所做的任何更改都将应用于原始模型。
QSortFilterProxyModel充当原始模型的包装器。如果需要将源QModelIndex es转换为已排序/已筛选的模型索引,或反之亦然,请使用mapToSource()、mapFromSource(),mapSelectionToSource(,和mapSelectionFromSource(,)。
默认情况下,只要原始模型发生更改,模型就会动态地对数据进行重新排序和重新筛选。可以通过设置dynamicSortFilter属性来更改此行为。
基本排序/筛选模型和自定义排序/筛选模式示例说明了如何使用QSortFilterProxyModel执行基本排序和筛选,以及如何将其子类化以实现自定义行为。
排序
QTableView和QTreeView具有sortingEnabled属性,该属性控制用户是否可以通过单击视图的水平标题对视图进行排序。例如:
treeView.setSortingEnabled(True)
当此功能打开(默认为关闭)时,单击标题部分会根据该列对项目进行排序。通过重复单击,用户可以在升序和降序之间交替。
在场景后面,视图调用模型上的sort()虚拟函数来重新排序模型中的数据。为了使数据可排序,您可以在模型中实现sort(),也可以使用QSortFilterProxyModel包装模型–QSortFilterProxy model提供了一个通用的sort(()重新实现,它对项的sortRole()(默认情况下为DisplayRole)进行操作,并理解多种数据类型,包括int、QString和QDateTime。对于分层模型,排序递归地应用于所有子项。默认情况下,字符串比较区分大小写;这可以通过设置sortCaseSensitivity属性来更改。
自定义排序行为是通过子类化QSortFilterProxyModel和重新实现用于比较项的lessTan()来实现的。例如:
MySortFilterProxyModel::lessThan(QModelIndex = bool()
right)= QModelIndex()
leftData = sourceModel().data(left)
rightData = sourceModel().data(right)
(此代码片段来自Custom Sort/Filter Model示例。)
排序的另一种方法是禁用视图上的排序,并将特定的顺序强加给用户。这是通过显式调用sort()来完成的,并将所需的列和顺序作为QSortFilterProxyModel上的参数(如果它实现了sort((),则在原始模型上)。例如:
proxyModel.sort(2, Qt.AscendingOrder)
QSortFilterProxyModel可以按列-1排序,在这种情况下,它将返回到基础源模型的排序顺序。
过滤
除了排序之外,QSortFilterProxyModel还可以用于隐藏与某个筛选器不匹配的项。该筛选器是使用QRegularExpression对象指定的,并应用于给定列的每个项的filterRole()(默认情况下为DisplayRole)。QRegularExpression对象可用于匹配正则表达式、通配符模式或固定字符串。例如:
对于分层模型,过滤器递归地应用于所有子级。如果父项与筛选器不匹配,则不会显示其任何子项。
一个常见的用例是让用户在QLineEdit中指定过滤器正则表达式、通配符模式或固定字符串,并将textChanged()信号连接到setFilterRegularExpression()、setFilterWildcard()或setFilterFixedString()以重新应用过滤器。
可以通过重新实现filterAcceptsRow()和filterAccept Column()函数来实现自定义过滤行为。例如(来自Custom Sort/Filter Model示例),以下实现忽略filterKeyColumn属性,并对列0、1和2执行筛选:
MySortFilterProxyModel::filterAcceptsRow(int = bool()
sourceParent)= QModelIndex()
index0 = sourceModel().index(sourceRow, 0, sourceParent)
index1 = sourceModel().index(sourceRow, 1, sourceParent)
index2 = sourceModel().index(sourceRow, 2, sourceParent)
return(sourceModel().data(index0).toString().contains(filterRegularExpression())
def sourceModel().data(index1).toString().contains(filterRegularExpression())):
def dateInRange(sourceModel().data(index2).toDate()):
(此代码片段来自Custom Sort/Filter Model示例。)
如果您正在处理大量的筛选,并且必须重复调用invalidateFilter(),则根据模型的实现情况,使用beginResetModel()/endResetMode()可能会更有效。但是,beginResetModel()/endResetModel)会将代理模型返回到其原始状态,从而丢失选择信息,并将导致代理模型重新填充。
子类别化
由于QAbstractProxyModel及其子类是从QAbstract ItemModel派生而来的,因此关于普通模型子类化的许多相同建议也适用于代理模型。此外,值得注意的是,此类中函数的许多默认实现都是为了调用相关源模型中的等效函数而编写的。对于具有更复杂行为的源模型,可能需要覆盖这种简单的代理机制;例如,如果源模型提供了一个自定义的hasChildren()实现,那么您也应该在代理模型中提供一个。
QSortFilterProxyModel属性
属性 | 描述 | 功能访问 |
---|---|---|
autoAcceptChildRows: bool | 如果此属性为true,则代理模型将不会筛选出已接受行的子行,即使它们本身也会被筛选出。。 默认值为false。 | autoAcceptChildRows() setAutoAcceptChildRows(accept) Signal autoAcceptChildRowsChanged(autoAcceptChildRows) |
dynamicSortFilter: bool | 无论何时源模型的内容发生变化,此属性都保持代理模型是否动态排序和筛选。 请注意,当dynamicSortFilter为true时,不应通过代理模型更新源模型。例如,如果在QComboBox上设置代理模型,那么使用更新模型的函数,例如addItem(),将无法按预期工作。另一种方法是将dynamicSortFilter设置为false,并在向QComboBox添加项目后调用sort()。 默认值为true。 | dynamicSortFilter() setDynamicSortFilter(enable) |
filterCaseSensitivity: CaseSensitivity | 此属性保持用于筛选源模型内容的QRegularExpression模式的大小写敏感性。。 默认情况下,筛选器区分大小写。 设置此属性会将新的区分大小写传播到filterRegularExpression属性,从而破坏其绑定。同样,显式设置filterRegularExpression会更改当前的区分大小写,从而破坏其绑定。 | filterCaseSensitivity() setFilterCaseSensitivity(cs) Signal filterCaseSensitivityChanged(filterCaseSensitivity) |
filterKeyColumn: int | 此属性保存从中读取用于筛选源模型内容的键的列。。 默认值为0。如果值为-1,则将从所有列中读取键。 | filterKeyColumn() setFilterKeyColumn(column) |
filterRegularExpression: PySide6.QtCore.QRegularExpression | 此属性包含用于筛选源模型内容的QRegularExpression。 通过QRegularExpression重载设置此属性会覆盖当前的filterCaseSensitivity。默认情况下,QRegularExpression是一个与所有内容匹配的空字符串。 如果没有设置QRegularExpression或空字符串,那么将接受源模型中的所有内容。 设置此属性会将新正则表达式的大小写敏感度传播到filterCaseSensitivity属性,从而断开其绑定。同样,显式设置filterCaseSensitivity会更改当前正则表达式的大小写敏感性,从而破坏其绑定。 | filterRegularExpression() setFilterRegularExpression(regularExpression) |
filterRole: int | 此属性包含筛选项时用于查询源模型数据的项角色。。 默认值为DisplayRole。 | filterRole() setFilterRole(role) Signal filterRoleChanged(filterRole) |
isSortLocaleAware: bool | 此属性保存用于在排序时比较字符串的本地感知设置。 默认情况下,排序不是本地感知的。 | isSortLocaleAware() setSortLocaleAware(on) Signal sortLocaleAwareChanged(sortLocaleAware) |
recursiveFilteringEnabled: bool | 此属性保持筛选器是否递归应用于子级,对于任何匹配的子级,其父级也将可见。。 默认值为false。 | isRecursiveFilteringEnabled() setRecursiveFilteringEnabled(recursive) Signal recursiveFilteringEnabledChanged(recursiveFilteringEnabled) |
sortCaseSensitivity: CaseSensitivity | 此属性保存排序时用于比较字符串的区分大小写设置。 默认情况下,排序区分大小写。 | sortCaseSensitivity() setSortCaseSensitivity(cs) Signal sortCaseSensitivityChanged(sortCaseSensitivity) |
sortRole: int | 此属性持有项目角色,用于在对项目排序时查询源模型的数据。。 默认值为DisplayRole。 | sortRole() setSortRole(role) Signal sortRoleChanged(sortRole) |
QSortFilterProxyModel方法
方法 | 描述 |
---|---|
autoAcceptChildRows()-> bool | 属性autoAcceptChildRows的Getter。 |
filterAcceptsColumn(source_column: int, source_parent: Union[PySide6.QtCore.QModelIndex, PySide6.QtCore.QPersistentModelIndex])-> bool | 如果给定source_column和source_parent指示的列中的项应包含在模型中,则返回true;否则返回false。 |
filterAcceptsRow(source_row: int, source_parent: Union[PySide6.QtCore.QModelIndex, PySide6.QtCore.QPersistentModelIndex])-> bool | 如果给定source_row和source_parent指示的行中的项目应包含在模型中,则返回true;否则返回false。 如果相关项所持有的值与筛选字符串、通配符字符串或正则表达式匹配,则默认实现将返回true。 默认情况下,DisplayRole用于确定是否应接受该行。这可以通过设置filterRole属性来更改。 |
filterCaseSensitivity() | 属性filterCaseSensitivity的Getter。 |
filterKeyColumn()-> int | 属性filterKeyColumn的Getter。 |
filterRegularExpression()-> PySide6.QtCore.QRegularExpression | 属性filterRegularExpression的Getter。 |
filterRole()-> int | 属性filterRole的Getter。 |
nvalidate()-> None | 使当前排序和筛选无效。 |
invalidateColumnsFilter()-> None | 使列的当前筛选无效。 如果您正在实现自定义筛选(通过filterAcceptsColumn()),并且您的筛选参数已更改,则应调用此函数。这与invalidateFilter()的不同之处在于,它不会调用filterAcceptsRow(),而只调用filterAcceptsColumn()。如果要隐藏或显示行不变的列,则可以使用此选项而不是invalidateFilter()。 |
invalidateFilter()-> None | 使当前筛选无效。 如果您正在实现自定义筛选(例如filterAcceptsRow()),并且您的筛选参数已更改,则应调用此函数。 |
invalidateRowsFilter()-> None | 使行的当前筛选无效。 如果您正在实现自定义筛选(通过filterAcceptsRow()),并且您的筛选参数已更改,则应调用此函数。这与invalidateFilter()的不同之处在于,它不会调用filterAcceptsColumn(),而只调用filterAcceptsRow()。如果要隐藏或显示列不变的行,则可以使用此选项而不是invalidateFilter()。 |
isRecursiveFilteringEnabled()-> bool | 属性recursiveFiltersEnabled的Getter已启用。 |
isSortLocaleAware()-> bool | 属性的Getter为SortLocaleAware。 |
lessThan(source_left: Union[PySide6.QtCore.QModelIndex, PySide6.QtCore.QPersistentModelIndex], source_right: Union[PySide6.QtCore.QModelIndex, PySide6.QtCore.QPersistentModelIndex])-> bool | 如果给定索引source_left引用的项的值小于给定索引source_right引用的项值,则返回true,否则返回false。 此函数在排序时用作<运算符,并处理以下QVariant类型: Int UInt LongLong ULongLong Float Double QChar QDate QTime QDateTime QString 任何其他类型都将使用toString()转换为QString。 默认情况下,QString s的比较区分大小写;这可以使用sortCaseSensitivity属性进行更改。 默认情况下,与QModelIndex es关联的DisplayRole用于比较。这可以通过设置sortRole属性来更改。 |
setAutoAcceptChildRows(accept: bool)-> None | 属性autoAcceptChildRows的设置程序。 |
setDynamicSortFilter(enable: bool)-> None | 属性dynamicSortFilter的集合。 |
setFilterCaseSensitivity(cs: PySide6.QtCore.Qt.CaseSensitivity)-> None | 属性filterCaseSensitivity的设置器。 |
setFilterFixedString(pattern: str)-> None | 将用于筛选源模型内容的固定字符串设置为给定的模式。 此方法将重置正则表达式选项,但要区分大小写。 调用此方法会更新正则表达式,从而破坏filterRegularExpression的绑定。但是,它对filterCaseSensitivity绑定没有影响。 |
setFilterKeyColumn(column: int)-> None | 属性筛选器集 |
setFilterRegularExpression(pattern: str)-> None setFilterRegularExpression(regularExpression: Union[PySide6.QtCore.QRegularExpression, str])-> None | 设置用于将源模型的内容筛选为模式的正则表达式。新代码应该首选此方法,因为它将在内部使用QRegularExpression。此方法将重置正则表达式选项,但要区分大小写。调用此方法会更新正则表达式,从而破坏filterRegularExpression的绑定。但是,它对filterCaseSensitivity绑定没有影响。 属性filterRegularExpression的设置程序。 |
setFilterRole(role: int)-> None | 属性filterRole的集合。 |
etFilterRole(role: int)-> None | 将用于筛选源模型内容的通配符表达式设置为给定的模式。 此方法将重置正则表达式选项,但要区分大小写。 调用此方法会更新正则表达式,从而破坏filterRegularExpression的绑定。但是,它对filterCaseSensitivity绑定没有影响。 |
setRecursiveFilteringEnabled(recursive: bool)-> None | 递归FilteringEnabled属性集。 |
etSortCaseSensitivity(cs: PySide6.QtCore.Qt.CaseSensitivity)-> None | 属性sortCaseSensitivity的设置程序。 |
setSortLocaleAware(on: bool)-> None | 属性的设置程序是SortLocaleAware。 |
setSortRole(role: int)-> None | 属性sortRole的设置程序。 |
sortCaseSensitivity()-> PySide6.QtCore.Qt.CaseSensitivity | 属性sortCaseSensitivity的Getter。 |
sortColumn()-> int | 返回当前用于排序的列 这将返回最近使用的排序列。默认值为-1,这意味着此代理模型不进行排序。 |
sortOrder()-> PySide6.QtCore.Qt.SortOrder | 返回当前用于排序的顺序 这将返回最近使用的排序顺序。默认值为升序。 |
sortRole()-> int | 属性sortRole的Getter。 |
QSortFilterProxyModel信号
信号 | 描述 |
---|---|
autoAcceptChildRowsChanged(autoAcceptChildRows:bool) | 当autoAcceptChildRows属性的值更改时,会发出此信号。属性autoAcceptChildRows的通知信号。 |
dynamicSortFilterChanged(dynamicSortFilter:bool) | |
filterCaseSensitivityChanged(filterCaseSensitivity:PySide6.QtCore.Qt.CaseSensitivity) | 当滤波器的大小写灵敏度变为filterCaseSensitivity时,会发出此信号。 属性filterCaseSensitivity的通知信号。 |
filterRoleChanged(filterRole:int) | 当筛选器角色更改为filterRole时,会发出此信号。 属性filterRole的通知信号。 |
recursiveFilteringEnabledChanged(recursiveFilteringEnabled:bool) | 当递归滤波器设置更改为recursiveFilteringEnabled时,会发出此信号。 属性recursiveFilteringEnabled的通知信号。 |
sortCaseSensitivityChanged(sortCaseSensitivity:PySide6.QtCore.Qt.CaseSensitivity) | 当排序的大小写敏感度更改为sortCaseSensitivity时,会发出此信号。 属性sortCaseSensitivity的通知信号。 |
sortLocaleAwareChanged(sortLocaleAware:bool) | 当区域设置感知设置更改为sortLocaleAware时,会发出此信号。 属性的通知信号为SortLocaleAware。 |
sortRoleChanged(sortRole:int) | 当排序角色更改为sortRole时,会发出此信号。 属性sortRole的通知信号。 |