| Home · All Classes · Modules · QSS HELP · QSS 案例 · VER007 HOME |
该QSortFilterProxyModel类提供用于排序和另一个模型和视图之间通过过滤数据的支持。More...
该QSortFilterProxyModel类提供用于排序和另一个模型和视图之间通过过滤数据的支持。
QSortFilterProxyModel可用于排序的项目,滤出产品,或两者兼而有之。该模型转换源模型的结构通过映射把它提供给新的索引,对应于不同地点的模型索引,视图使用。这种方法允许一个给定的源模型被尽可能的观点而言,无需对基础数据的任何转换,并没有复制在内存中的数据重组。
让我们假设我们想通过排序和筛选的自定义模型提供的项目。该代码来设置的模型和视图,without排序和过滤,看起来像这样:
QTreeView *treeView = new QTreeView;
MyItemModel *model = new MyItemModel(this);
treeView->setModel(model);
要添加排序和筛选支持MyItemModel,我们需要创建一个QSortFilterProxyModel ,呼叫setSourceModel()与MyItemModel作为参数,并在视图安装QSortFilterProxyModel :
QTreeView *treeView = new QTreeView;
MyItemModel *sourceModel = new MyItemModel(this);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(sourceModel);
treeView->setModel(proxyModel);
在这一点上,既不排序也不过滤功能,原始数据被显示在视图中。通过QSortFilterProxyModel所做的任何更改应用到原始模型。
该QSortFilterProxyModel作为一个包装器的原始模型。如果你需要转换的源QModelIndex上课要排序/筛选模型的索引,反之亦然,使用mapToSource( )mapFromSource( )mapSelectionToSource()和mapSelectionFromSource( ) 。
Note:默认情况下,该模型没有动态重新排序和重新过滤数据时的原始模型的变化。这种行为可以通过设置改变dynamicSortFilter属性。
该Basic Sort/Filter Model和Custom Sort/Filter Model示例说明了如何使用QSortFilterProxyModel执行基本分类和过滤,以及如何它的子类来实现自定义的行为。
QTableView和QTreeView有sortingEnabled属性控制用户是否可以通过单击视图的水平标题排序的视图。例如:
treeView->setSortingEnabled(true);
当此功能开启(默认是关闭的) ,点击标题部分按照该列进行排序的项目。通过点击多次,用户可以在升序和降序之间交替。

幕后,视图调用sort()的模型来重新排列在该模型中的数据的虚拟功能。为了使您的数据排序,你可以实现sort( )在你的模型,或使用QSortFilterProxyModel来包装你的模型 - QSortFilterProxyModel提供了一个通用sort()的重新实现该操作的sortRole( ) (Qt.DisplayRole默认情况下)的项目,并能够理解多种数据类型,包括int,QString和QDateTime。对于分层模型,排序是递归应用到所有子项。比较字符串时默认情况下,敏感的,这可以通过设置改变sortCaseSensitivity属性。
自定义排序行为是通过继承QSortFilterProxyModel和重新实现实现lessThan(),它是用于比较的商品。例如:
bool MySortFilterProxyModel.lessThan(const QModelIndex &left, const QModelIndex &right) const { QVariant leftData = sourceModel()->data(left); QVariant rightData = sourceModel()->data(right); if (leftData.type() == QVariant.DateTime) { return leftData.toDateTime() < rightData.toDateTime(); } else { QRegExp *emailPattern = new QRegExp("([\\w\\.]*@[\\w\\.]*)"); QString leftString = leftData.toString(); if(left.column() == 1 && emailPattern->indexIn(leftString) != -1) leftString = emailPattern->cap(1); QString rightString = rightData.toString(); if(right.column() == 1 && emailPattern->indexIn(rightString) != -1) rightString = emailPattern->cap(1); return QString.localeAwareCompare(leftString, rightString) < 0; } }
(此代码片段来自Custom Sort/Filter Model例子)。
另一种方法来排序是禁用的视图排序并施以一定的顺序给用户。这是通过显式调用完成sort( )与所需的列和顺序上的QSortFilterProxyModel参数(或原始模型,如果它实现sort())。例如:
proxyModel->sort(2, Qt.AscendingOrder);
QSortFilterProxyModel可以通过柱-1进行排序,在这种情况下它返回到底层源模型的排序顺序。
除了排序, QSortFilterProxyModel可以用来隐藏不匹配有一定的过滤项。使用指定的过滤器被QRegExp对象和被施加到filterRole( ) (Qt.DisplayRole默认情况下)各项目时,对于给定的列中。该QRegExp对象可以用来匹配一个正则表达式,通配符模式,或一个固定的字符串。例如:
proxyModel->setFilterRegExp(QRegExp(".png", Qt.CaseInsensitive,
QRegExp.FixedString));
proxyModel->setFilterKeyColumn(1);
对于分层模型,过滤器被递归应用到所有的孩子。如果父项不匹配滤波器,将显示其没有孩子。
一个常见的用例是让用户指定一个过滤器正则表达式,通配符模式,或固定字符串QLineEdit和连接textChanged()信号到setFilterRegExp( )setFilterWildcard() ,或setFilterFixedString( )重新应用筛选器。
自定义过滤行为可以通过重新实现来实现的filterAcceptsRow()和filterAcceptsColumn()函数。例如(从Custom Sort/Filter Model例子) ,下面的实现会忽略filterKeyColumn财产和执行对列0 , 1 ,和2过滤:
bool MySortFilterProxyModel.filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const { QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent); QModelIndex index1 = sourceModel()->index(sourceRow, 1, sourceParent); QModelIndex index2 = sourceModel()->index(sourceRow, 2, sourceParent); return (sourceModel()->data(index0).toString().contains(filterRegExp()) || sourceModel()->data(index1).toString().contains(filterRegExp())) && dateInRange(sourceModel()->data(index2).toDate()); }
(此代码片段来自Custom Sort/Filter Model例子)。
如果您正在使用大量的滤波,并有调用invalidateFilter( )反复使用reset( )可能更有效,这取决于你的模型的实现。但是,reset()返回的代理模型到其原始状态,失去了选择信息,并且将导致要重新填充所述代理模型。
自QAbstractProxyModel和它的子类都源自QAbstractItemModel,许多关于继承正常模式相同的建议也适用于代理模型。此外,值得一提的是,许多在这个类函数的默认实现是这么写的,他们在程序中调用相关的源模型的等效功能。这个简单的代理机制,可能需要对源模型更复杂的行为被重写,例如,如果源模型提供了一个自定义的hasChildren()实现,你也应该提供一个在代理模型。
Note:可在子类化模型的一些通用准则Model Subclassing Reference。
该parent的说法,如果不是没有,原因self通过Qt的,而不是PyQt的拥有。
构造一个排序滤波器模型与给定parent。
从重新实现QAbstractItemModel.buddy( ) 。
从重新实现QAbstractItemModel.canFetchMore( ) 。
这种方法也是一个Qt槽与C + +的签名void clear()。
从重新实现QAbstractItemModel.columnCount( ) 。
从重新实现QAbstractItemModel.data( ) 。
See also setData( ) 。
从重新实现QAbstractItemModel.dropMimeData( ) 。
从重新实现QAbstractItemModel.fetchMore( ) 。
返回True如果该列中的项表示在给定的source_column和source_parent应包括在模型中,否则返回False 。
如果有关项目中保存的值过滤字符串,字符串通配符或正则表达式匹配的默认实现返回True 。
Note:默认情况下,Qt.DisplayRole用于确定是否该行应该被接受或没有。这可以通过设置来改变该filterRole属性。
See also filterAcceptsRow( )setFilterFixedString( )setFilterRegExp()和setFilterWildcard( ) 。
返回True如果该行中的项目表示在给定的source_row和source_parent应包括在模型中,否则返回False 。
如果有关项目中保存的值过滤字符串,字符串通配符或正则表达式匹配的默认实现返回True 。
Note:默认情况下,Qt.DisplayRole用于确定是否该行应该被接受或没有。这可以通过设置来改变该filterRole属性。
See also filterAcceptsColumn( )setFilterFixedString( )setFilterRegExp()和setFilterWildcard( ) 。
从重新实现QAbstractItemModel.flags( ) 。
从重新实现QAbstractItemModel.hasChildren( ) 。
从重新实现QAbstractItemModel.headerData( ) 。
See also setHeaderData( ) 。
从重新实现QAbstractItemModel.index( ) 。
从重新实现QAbstractItemModel.insertColumns( ) 。
从重新实现QAbstractItemModel.insertRows( ) 。
这种方法也是一个Qt槽与C + +的签名void invalidate()。
无效的当前排序和过滤。
此功能被引入Qt的4.3 。
See also invalidateFilter( ) 。
无效的电流滤波。
这个功能应该如果要实现自定义的过滤(被称为例如:filterAcceptsRow( ) ) ,以及您的滤波器参数发生了变化。
此功能被引入Qt的4.3 。
See also invalidate( ) 。
返回True如果该项目的值称为给定索引left由给定的索引小于该项目的值称为right,否则返回False 。
在排序时,此功能是用来作为\u003c操作符,和处理以下QVariant类型:
任何其他类型将被转换为一个QString using QVariant.toString( ) 。
比较QStrings的情况下,默认情况下,敏感,这可以通过使用被改变sortCaseSensitivity属性。
默认情况下,Qt.DisplayRole与相关联的QModelIndexES是用于比较。这可以通过设置来改变该sortRole属性。
Note:通过在对应于源模型中的指标。
See also sortRole,sortCaseSensitivity和dynamicSortFilter。
从重新实现QAbstractProxyModel.mapFromSource( ) 。
返回模型指数在QSortFilterProxyModel考虑到sourceIndex从源模型。
See also mapToSource( ) 。
从重新实现QAbstractProxyModel.mapSelectionFromSource( ) 。
从重新实现QAbstractProxyModel.mapSelectionToSource( ) 。
从重新实现QAbstractProxyModel.mapToSource( ) 。
返回对应于给定的源模型指数proxyIndex从分类筛选模型。
See also mapFromSource( ) 。
从重新实现QAbstractItemModel.match( ) 。
该QMimeData结果
从重新实现QAbstractItemModel.mimeData( ) 。
从重新实现QAbstractItemModel.mimeTypes( ) 。
从重新实现QAbstractItemModel.parent( ) 。
从重新实现QAbstractItemModel.removeColumns( ) 。
从重新实现QAbstractItemModel.removeRows( ) 。
从重新实现QAbstractItemModel.rowCount( ) 。
从重新实现QAbstractItemModel.setData( ) 。
See also data( ) 。
这种方法也是一个Qt槽与C + +的签名void setFilterFixedString(const QString&)。
设置用于对源模型的内容进行筛选,以给定的固定字符串pattern。
See also setFilterCaseSensitivity( )setFilterRegExp( )setFilterWildcard()和filterRegExp( ) 。
这种方法也是一个Qt槽与C + +的签名void setFilterRegExp(const QString&)。
这种方法也是一个Qt槽与C + +的签名void setFilterWildcard(const QString&)。
设置用于对源模型的内容进行筛选,以给定的通配符表达式pattern。
See also setFilterCaseSensitivity( )setFilterRegExp( )setFilterFixedString()和filterRegExp( ) 。
从重新实现QAbstractItemModel.setHeaderData( ) 。
See also headerData( ) 。
从重新实现QAbstractProxyModel.setSourceModel( ) 。
从重新实现QAbstractItemModel.sort( ) 。
目前用于排序的列
这将返回最近使用的排序列。
此功能被引入Qt的4.5 。
目前用于排序的顺序
这将返回最近使用的排序顺序。
此功能被引入Qt的4.5 。
从重新实现QAbstractItemModel.span( ) 。
从重新实现QAbstractItemModel.supportedDropActions( ) 。
| PyQt 4.10.3 for X11 | Copyright © Riverbank Computing Ltd and Nokia 2012 | Qt 4.8.5 |