1、说明
QSortFilterProxyModel类继承自QAbstractProxyModel是一个代理类,存在于另一模型Model和视图View之间,将另一个模型排序或者过滤后在视图上显示。
2、简单示例
没有使用代理的项视图模型代码如下
QTreeView *treeView = new QTreeView;
MyItemModel *model = new MyItemModel(this);
treeView->setModel(model);
使用代理的项视图模型代码如下:
QTreeView *treeView = new QTreeView;
MyItemModel *sourceModel = new MyItemModel(this);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);
proxyModel->setSourceModel(sourceModel);
treeView->setModel(proxyModel);
上面的示例中,只是加入了代理,但并没有启动过滤和排序,原始数据显示在视图中。
3、属性
dynamicSortFilter : bool
该属性表示:代理模型是否在源模型的内容更改时动态排序和筛选,默认是true;
操作函数:
bool dynamicSortFilter() const
void setDynamicSortFilter(bool enable)
filterCaseSensitivity : Qt::CaseSensitivity
该属性表示:过滤器是否区分大小写,默认是区分大小写;
操作函数:
Qt::CaseSensitivity filterCaseSensitivity() const
void setFilterCaseSensitivity(Qt::CaseSensitivity cs)
filterKeyColumn : int
该属性表示:从哪列获取值来作为过滤的关键值,默认是0(第一列);如果设为-1表示从所有列中取关键值。
操作函数:
int filterKeyColumn() const
void setFilterKeyColumn(int column)
filterRegExp : QRegExp
该属性表示:过滤的时用到的正则表达式QRegExp,默认是空,匹配所有;
操作函数:
QRegExp filterRegExp() const
void setFilterRegExp(const QString &pattern)
void setFilterRegExp(const QRegExp ®Exp)
filterRegularExpression : QRegularExpression
同上,在Qt 5.12中引入,QRegularExpression兼容Prel,在使用正则表达式时,推荐使用QRegularExpression来代替QRegExp;
操作函数;
QRegularExpression filterRegularExpression() const
void setFilterRegularExpression(const QString &pattern)
void setFilterRegularExpression(const QRegularExpression ®ularExpression)
filterRole : int
该属性表示:过滤时取该项的哪个角色的值,默认值为Qt :: DisplayRole;
操作函数:
int filterRole() const
void setFilterRole(int role)
isSortLocaleAware : bool
该属性表示:在对字符串排序时,是否考虑本地因素,默认是不考虑;
操作函数:
bool isSortLocaleAware() const
void setSortLocaleAware(bool on)
recursiveFilteringEnabled : bool
该属性表示:过滤时,是否以递归方式匹配子项,如果子项可见,其父项也将可见;默认是false,在Qt 5.10引入
操作函数:
bool isRecursiveFilteringEnabled() const
void setRecursiveFilteringEnabled(bool recursive)
sortCaseSensitivity : Qt::CaseSensitivity
该属性表示:在排序时,是否区分大小写,默认是区分大小写
操作函数:
Qt::CaseSensitivity sortCaseSensitivity() const
void setSortCaseSensitivity(Qt::CaseSensitivity cs)
sortRole : int
该属性表示:排序时取该项的哪个角色的值,默认值为Qt :: DisplayRole;
操作函数:
int sortRole() const
void setSortRole(int role)
4、公共函数
QSortFilterProxyModel(QObject *parent = nullptr)
构造函数;
virtual ~QSortFilterProxyModel()
析构函数;
bool dynamicSortFilter() const
设置当源数据发生更改时,是否自动排序和过滤;
注意:当dynamicSortFilter为true时,不应通过代理模型更新源模型。例如,如果在QComboBox上设置代理模型,则使用更新模型的函数(例如addItem())将无法按预期工作。另一种方法是将dynamicSortFilter设置为false,并在将项添加到QComboBox后调用sort()。
参见属性:dynamicSortFilter;
Qt::CaseSensitivity filterCaseSensitivity() const
过滤时,是否区分大小写,参见属性:dynamicSortFilter;
int filterKeyColumn() const
返回从哪列获取值来作为过滤的关键值,;如果返回-1表示从所有列中取关键值;
参见属性:filterKeyColumn;
QRegExp filterRegExp() const
参见属性:filterRegExp;
QRegularExpression filterRegularExpression() const
参见属性:filterRegularExpression;
int filterRole() const
参见属性:filterRole;
bool isRecursiveFilteringEnabled() const
参见属性:isRecursiveFilteringEnabled;
bool isSortLocaleAware() const
参见属性:isSortLocaleAware;
void setDynamicSortFilter(bool enable)
参见属性:dynamicSortFilter;
void setFilterCaseSensitivity(Qt::CaseSensitivity cs)
参见属性:dynamicSortFilter;
void setFilterKeyColumn(int column)
参见属性:filterKeyColumn;
void setFilterRole(int role)
参见属性:filterRole;
void setRecursiveFilteringEnabled(bool recursive)
参见属性:recursiveFilteringEnabled ;
void setSortCaseSensitivity(Qt::CaseSensitivity cs)
参见属性:sortCaseSensitivity ;
void setSortLocaleAware(bool on)
参见属性:isSortLocaleAware ;
void setSortRole(int role)
参见属性:sortRole;
Qt::CaseSensitivity sortCaseSensitivity() const
参见属性:sortCaseSensitivity ;
int sortColumn() const
返回最近使用哪列排序的;
Qt::SortOrder sortOrder() const
返回最近使用的排列顺序;
int sortRole() const
参见属性:sortRole;
5、虚函数
virtual QModelIndex buddy(const QModelIndex &index) const override
返回由index表示的项的伙伴的模型索引。当用户想要编辑项目时,视图将调用此函数来检查是否应该编辑模型中的另一个项目。然后,视图将使用buddy项返回的模型索引构造委托。
此函数的默认实现将每个项目作为其自己的伙伴。
virtual bool canFetchMore(const QModelIndex &parent) const override
如果子项中有可用于父项parent的数据,则返回true,默认是始终返回false;
如果返回true,可以使用fetchMore来获取
virtual int columnCount(const QModelIndex &parent = QModelIndex()) const override
返回父项的列数;
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override
返回给定引索index、给定角色role的数据;
virtual bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) override
用于项视图的拖放;当给定Mime数据,可以在给定父对象parent的行row、列column中执行action成功了,返回true,否则返回false;
virtual void fetchMore(const QModelIndex &parent) override
使用parent引指定的父项获取项目的所有可用数据。
virtual Qt::ItemFlags flags(const QModelIndex &index) const override
根据引索index返回,项的标记,如可以编辑Qt::ItemIsEditable、可以选中Qt::ItemIsSelectable等
virtual bool hasChildren(const QModelIndex &parent = QModelIndex()) const override
如果parent有子项则返回true,否则返回false;
virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
返回指定方向orientation的标题中给定角色role和节section的数据。
对于水平标题,节号对应于列号。类似地,对于垂直标题,节号对应于行号。
virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override
返回给定parent父引索中指定行、列的项的引索;
virtual bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
在给定父项的第column列前插入一列,成功返回true;
virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
在给定父项的第row行前插入一行,成功返回true;
virtual QModelIndex mapFromSource(const QModelIndex &sourceIndex) const override
返回源模型中sourceIndex对应的代理模型的引索;
virtual QItemSelection mapSelectionFromSource(const QItemSelection &sourceSelection) const override
返回源模型中sourceSelection对应代理模型中的选择项;
virtual QItemSelection mapSelectionToSource(const QItemSelection &proxySelection) const override
返回代理模型中proxySelection对应的源模型中的选择项;
virtual QModelIndex mapToSource(const QModelIndex &proxyIndex) const override
返回代理模型中proxyIndex对应的源模型的项;
virtual QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap)) const override
返回从start项开始,和数据value匹配的,最多hits个项列表;
virtual QMimeData * mimeData(const QModelIndexList &indexes) const override
返回一个对象,该对象包含与指定索引列表indexes对应的序列化数据项;
virtual QStringList mimeTypes() const override
返回允许的MIME类型列表。默认情况下,内置模型和视图使用内部MIME类型:application/x-qabstractitemmodeldatalist。
virtual QModelIndex parent(const QModelIndex &child) const override
返回具有给定索引的模型项的父级。如果项目没有父项,则返回无效的QModelIndex。
virtual bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex()) override
删除parent项中第column列以下count个列;
virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override
删除parent项中第row行以下count个行;
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const override
返回指定parent项的行数;
virtual bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override
设置给定项引索index项中角色role的数据值为value;
virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override
设置指定方向orientation的指定字段section中角色role的数据值为value;
virtual void setSourceModel(QAbstractItemModel *sourceModel) override
设置代理模型的源模型;
virtual QModelIndex sibling(int row, int column, const QModelIndex &idx) const override
返回index处项目的行和列的兄弟节点,如果该位置没有兄弟节点,则返回无效的QModelIndex。
virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override
按给定顺序order对column列进行排序。
virtual QSize span(const QModelIndex &index) const override
返回index表示的项的行和列跨度。
virtual Qt::DropActions supportedDropActions() const override
返回该模型支持的拖拽的动作。
6、槽函数
void invalidate()
使当前排序和筛选无效。
void setFilterFixedString(const QString &pattern)
将用于过滤源模型内容的固定字符串设置为给定模式。
void setFilterRegExp(const QRegExp ®Exp)
将用于过滤源模型内容的正则表达式设置为regExp
void setFilterRegExp(const QString &pattern)
将用于过滤源模型内容的正则表达式设置为pattern
void setFilterRegularExpression(const QString &pattern)
将用于过滤源模型内容的正则表达式设置为pattern
void setFilterRegularExpression(const QRegularExpression ®ularExpression)
将用于过滤源模型内容的正则表达式设置为regularExpression
void setFilterWildcard(const QString &pattern)
将用于筛选源模型内容的通配符表达式设置为给定模式。
7、静态函数
const QMetaObject staticMetaObject
8、保护函数
virtual bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const
如果指定的source_column和source_parent所指示的列中的项应该包含在模型中,则返回true;否则返回false。
如果相关项所持有的值与过滤器字符串、通配符字符串或正则表达式匹配,则默认实现返回true。
virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
如果给定的source_row和source_parent所指示的行中的项应该包含在模型中,则返回true;否则返回false。
如果相关项所持有的值与过滤器字符串、通配符字符串或正则表达式匹配,则默认实现返回true。
void invalidateFilter()
使当前筛选无效。
如果您正在实现自定义筛选(例如filterAcceptsRow()),并且您的筛选器参数已经更改,则应该调用此函数。
这个函数是在Qt 4.3中引入的。
virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const
如果给定索引source_left引用的项的值小于给定索引source_right引用的项的值,则返回true,否则返回false。