•.概述
•.使用代理模型
•.自定义代理模型
•.自定义过滤模型
•.自定义排序模型
在模型 /视图框架中,由一个单独的模型提供的数据条目可以 被任意个数的视图共享,而且这些视图中的任意一个 都可以将相同的数据以完全不同的方式呈现。自定义视图和代表是对相同的数据提供完全不同的展示的有效方法 。然而 ,程序经 常需要在相同的数据的不同的加工后的版本上提供惯用的视图,例如对一个条目列表的不同排序的视图 。
尽管看起来以视图的内部函数的方式来进行排序和过滤操作是合适的 ,这种实现方式不允许多个视图共享这种大开销的操作的结果 。另外一种实现方式 ,牵涉到在模型中自己排序 ,导致了类似的问题 ,那样每个视图只能显示依据最新的处理操作组织的数据条目 。
为了解决这个问题 ,模型 /视图框架使用代理模型来管理在单个模型和视图之间提供的信息。代理模型是从视图的角度来看表现得像一般的模型 ,并且伴随的那个视图的行为而访问源模型的数据 的组件 。模型 /视图框架使用的信号和信号槽保证了每个视图都被适当地更新,无论有多少代理模型被放置到它自己和源模型之间。
代理模型可以插入到一个已有的模型和任意个数的视图之间 。Qt 中提供了一个标准的代理模型 , QSortFilterProxyModel ,它通常是示例性的,而且被直接使用,但是也可以 被子类化以提供自定义的过滤和排序行为。 QSortFilterProxyModel 类可以按照下面的方式来使用 :
QSortFilterProxyModel *filterModel = new QSortFilterProxyModel(parent);
filterModel->setSourceModel(stringListModel);
QListView *filteredView = new QListView;
filteredView->setModel(filterModel);
由于代理模型是继承自 QAbstractItemModel 的 ,它们可以连接到任意类型的视图,而且可以在视图之间共享 。它们也可以以一种管道的方式来安排 , 用来处理从其它代理模型获取的信息 。
QSortFilterProxyModel 类 被设计为示例性的、在程序中直接使用的。可以通过子类化这个类并且实现必需的比较操作来创建更特殊的代理模型 。
一般地 ,在一个代理模型中使用的处理的各类牵涉到将每个数据条目从它在源模型中的位置映射到代理模型中相同或者不相同的位置 。在某些模型中 ,有些条目可能在代理模型中没有对应的位置 ;这些模型是 过滤 代理模型 。视图使用代理模型提供的模型索引来访问条目 ,而这些模型索引不包含关于源模型以及原始条目在那个模型中的位置的信息 。
QSortFilterProxyModel使得来自源模型的数据在 被提供给视图之前被过滤,并且还允许来自源模型的内容以 预排序的数据的形式被提供给视图。
QSortFilterProxyModel 类提供一个多功能的可 被用于多种通用情形的过滤模型。对于高级用户 , QSortFilterProxyModel 可以被子类化,这样就提供了一个使得自定义过滤器可以被实现的机制。
QSortFilterProxyModel 的子类可以重载两个在代理模型中的模型索引 被索取或者使用的时候被调用的虚函数:
•. filterAcceptsColumn()被用来从源模型的一部分过滤特定的列。
•. filterAcceptsRow()被 用来从源模型的一部分过滤特定的行。
在 QSortFilterProxyModel 里面 , 上面的函数的默认实现返回真以确保所有的条目 被传递到视图;对这些函数的重载应当返回假以过滤掉单个的行和列 。
QSortFilterProxyModel的实例使用 Qt 内置的qStableSort () 函数来建立源模型的条目到代理模型使用的条目之间的一个映射 ,允许在不修改源模型的结构的情况下将一个排序过的层次 型条目结构暴露给视图。要提供自定义的排序行为 ,就重载lessThan()函数以实现自定义的比较。
Your opinionsHxLauncher: Launch Android applications by voice commands