在模型/视图框架中,单个模型提供的数据项可以由多个视图共享,并且每个视图可能以完全不同的方式表示相同的信息。自定义视图和委托是提供相同数据完全不同的表示形式的有效方法。但是,应用程序通常需要在相同数据的处理版本上提供常规视图,例如在项列表中对不同排序的视图。
尽管将排序和筛选操作作为视图的内部功能似乎合适,但此方法不允许多个视图共享此类潜在成本高昂的操作的结果。另一种方法(涉及在模型本身中排序)会导致类似的问题,即每个视图必须显示根据最近的处理操作组织的数据项。
为了解决这个问题,模型/视图框架使用代理模型来管理各个模型和视图之间提供的信息。从视图的角度来看,代理模型的行为类似于普通模型,并代表该视图从源模型访问数据。模型/视图框架使用的信号和槽确保了每个视图都得到了适当的更新,无论在它自己和源模型之间放置了多少代理模型。
使用代理模型
代理模型可以插入到现有模型和任意数量的视图之间。Qt提供了一个标准的代理模型QSortFilterProxyModel,它通常被实例化并直接使用,但也可以子类化以提供自定义的过滤和排序行为。QSortFilterProxyModel类可以以以下方式使用:
QSortFilterProxyModel *filterModel = new QSortFilterProxyModel(parent)<