在模型-视图框架中,单个模型提供的数据项可以被任意数量的视图共享,并且每个视图可能以完全不同的方式表示相同的信息。但是在实际情况中,应用程序通常需要提供对相同数据的不同视图显示(例如对项列表的不同排序视图)。 使用自定义视图和委托是提供相同数据的不同表示形式的有效方法。
虽然执行排序和筛选操作作为视图的内部功能看起来是适当的,但是这种方法不允许多个视图共享这种可能代价高昂操作。其中每个视图必须显示根据最新处理操作组织的数据项,涉及在模型本身内进行排序的替代方法也会导致类似的问题。
为了解决此问题,模型-视图框架使用代理模型来管理各个模型和视图之间提供的信息。从视图的角度来看,代理模型是行为类似于普通模型的组件,并代表该视图从源模型访问数据。模型-视图框架使用的信号和插槽确保无论在其自身与源模型之间放置多少代理模型,每个视图都将适当更新。
可以在现有模型和任意数量的视图之间插入代理模型。Qt提供了一个标准的代理模型QSortFilterProxyModel,该模型通常被实例化并直接使用,但是也可以被子类化以提供自定义的过滤和排序行为。该QSortFilterProxyModel类可以通过以下方式使用:
filterModel = QSortFilterProxyModel(parent)
filterModel.setSourceModel(stringListModel)
filteredView = QListView(self)
filterView.setModel(filterModel)由于代理模型继承自QAbstractItemModel,因此它们可以连接到任何类型的视图,并且可以在视图之间共享。它们也可以通过设置一个管道途径来处理从其它代理模型得到的信息。
该QSortFilterProxyModel类被设计成可以实例化并直接在应用程序中使用。通过子类化来创建更多专门的代理模型,可以实现应用所需的各种比较操作。
通常情况下,代理模型中使用的处理类型涉及将每一项数据从源模型中的原始位置映射到代理模型中的不同位置。在某些模型中,某些项在代理模型中可能没有对应的位置;这些模型就是筛选代理模型。使用代理模型提供的模型索引查看访问项,这些索引不包含有关源模型或该模型中原始项的位置的信息。
QSortFilterProxyModel使源模型中的数据可以在提供给视图之前进行筛选,并且还允许将源模型的内容作为排好序的数据提供给视图。
QSortFilterProxyModel类提供了一个通用的筛选模式,可以用于各种常见情况。对于高级用户,可以对QSortFilterProxyModel进行子类化,从而提供一种执行自定义筛选的机制。
QSortFilterProxyModel的子类可以重新实现两个虚拟函数,当请求或使用来自代理模型的模型索引时,它们就会被调用:
filterAcceptsColumn(),用于筛选源模型中指定的列。
filterAcceptsRow(),用于筛选源模型中指定的行。
以上连个QSortFilterProxyModel中的函数的默认实现返回True,以确保所有项都可以传递给视图。重新实现这些函数应该返回False,以筛选出单独的行和列。
QSortFilterProxyModel 实例使用Qt内建的qStableSort()函数来建立源模型项和代理模型项之间的映射,在不改变源模型结构的情况下将一个排序后的项显示到视图上。为了提供自定义的排序行为,就要重新实现 lessThan()函数以执行自定义的比较。
创建一个文件系统模型QFileSystemModel作为一个继承QSortFilterProxyModel的自定义模型SortProxyModel的源模型,创建一个QTreeView树形视图来显示这个代理模型,完整源代码如下:
importsys
fromPyQt5importQtCore,QtGui,QtWidgets
fromPyQt5.QtCoreimport(Qt,QDir,QSortFilterProxyModel,QModelIndex)
fromPyQt5.QtWidgetsimport(QApplication,QMainWindow,QTreeView,QFileSystemModel)
classSortProxyModel(QSortFilterProxyModel):
deflessThan(self,left_index,right_index):
#获取QVariant对象
left_var=left_index.data(Qt.DisplayRole)
right_var=right_index.data(Qt.DisplayRole)
return(left_var运行结果如下图
演示自定义代理模型
喜欢本文内容就关注, 收藏,点赞,评论和转发。
版权声明:我们致力于保护作者版权,注重分享,被刊用文章【代理模型(实战PyQt5)】因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!;
工作时间:8:00-18:00
客服电话
电子邮件
beimuxi@protonmail.com
扫码二维码
获取最新动态
