PyQt(Python+Qt)学习随笔:model/view架构中的排序和代理模型QSortFilterProxyModel
一、概述
在Model/View体系架构中,有两种方法可以进行排序;选择哪种方法取决于底层模型。
- 如果模型是可排序的,即模型类实现了QAbstractItemModel.sort()函数,如QTableView和QTreeView都提供一个API,允许以编程方式对模型数据进行排序。此外,还可以通过将QHeaderView.sortIndicatorChanged()信号连接到QTableView .sortByColumn()槽函数或QTreeView.sortByColumn()槽函数来启用交互式排序(即允许用户通过单击视图的标题对数据进行排序)。
- 另一种方法是,如果模型没有所需的接口,或者想使用列表视图(list View)来显示数据,则在视图中显示数据之前,使用代理模型来转换模型的结构。
二、代理模型
2.1、概述
在Model/View框架中,单个模型提供的数据项可以由任意数量的视图共享,并且每个视图可能以完全不同的方式表示相同的信息。自定义视图和代理是为同一数据提供完全不同展示结果的有效方法。但应用程序通常需要为相同数据的已处理版本提供常规视图,例如为列表数据提供不同排序的展现视图。
尽管将排序和筛选操作作为视图的内部方法来执行看起来可行,但是排序和筛选操作代价高,如果存在多个视图展示相同的数据时,每个视图数据排序按不同方式排序,如果每个视图实现类似的方法,这种操作代价高昂。
另一种方法就是在模型本身对数据进行排序,这导致每个视图都必须显示根据最近的排序或刷选操作处理后的数据项,同样代价高。
为了解决这个问题,Model/View框架使用代理模型来管理在各个模型和视图之间交互的信息。代理模型是一些组件,从视图的角度来看,它们的行为类似于普通Model,并代表该视图访问源模型中的数据。Model/View框架使用的信号和槽机制确保无论在其自身和源模型之间放置了多少代理模型,每个视图都会得到适当的更新。
老猿理解代理模型就是提供在其他的model和view之间排序和过滤数据的支持功能使用的的,在代理模型中可以对项进行排序和筛选,这种方法允许一个model采用和其视图功能匹配的要求重新组织,但不需要在数据和源模型上做任何处理,也不需要复制内存中的数据,可以有效提高效率。
2.2、使用代理模型
代理模型可以插入到现有模型和任意数量的视图之间。PyQt和Qt提供了一个标准的代理模型QSortFilterProxyModel,它通常是直接实例化和使用的,但也可以从其派生子类来提供自定义的筛选和排序行为。
QSortFilterProxyModel类可以按以下方式使用:
1. 定义代理模型对象
语法:proxyModel = QSortFilterProxyModel((QObject parent)
2. 设置代理模型的数据源模型
语法:代理模型.setSourceModel(数据源模型)
其中代理模型就是第一步定义的模型,数据源模型即前面第三部分介绍的Model,为真正访问数据的模型。
3. 设置视图对应模型为代理模型
语法:视图.setModel(proxyModel )
2.3、代理模型小结
从以上语法看到,代理模型本身对外是个Model,但自身的数据源也是个Model。
由于代理模型继承自QAbstractItemModel,因此它们可以连接到任何类型的视图,并且可以在视图之间共享。它们还可用于从其他代理模型获得信息,类似代理模型到数据Model之间象管道一样排列使用。
QSortFilterProxyModel类被设计为实例化并直接在应用程序中使用,也可以通过特殊派生的子类实现所需的比较操作,从而创建更专门的代理模型。
QSortFilterProxyModel的具体过滤和刷选的方法请参考类相关的方法介绍,在此不进行展开说明。

老猿Python,跟老猿学Python!
PyQt(Python+Qt)学习随笔:model/view架构中的排序和代理模型QSortFilterProxyModel的更多相关文章
- 第15.28节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTableWidget详解
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 表格部件为应用程序提供标准的表格显示工具,在表格内可以管理基于行和列的数据项,表格中的最大 ...
- 第15.27节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTreeWidget详解
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 树部件(Tree Widget)是Qt Designer中 Item Widgets(It ...
- 第15.26节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QListWidget详解
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 列表部件(List Widget)对应类QListWidget,是从QListView派生 ...
- PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性不能覆盖写的问题
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dra ...
- PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性
老猿Python博文目录 老猿Python博客地址 一.属性的作用 dragDropOverwriteMode属性用于控制视图的拖放行为,如果其值为True,则视图中选定的数据将在拖拽数据放下时被覆盖 ...
- PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled属性的困惑
老猿Python博文目录 老猿Python博客地址 dragEnabled属性用于控制视图是否支持拖拽,可以通过dragEnabled().setDragEnabled(bool enable)进行属 ...
- PyQt(Python+Qt)学习随笔:QAbstractItemView的selectionMode属性
老猿Python博文目录 老猿Python博客地址 一.概述 selectionMode属性用于控制view中操作选择数据项的模式,用于控制用户是否可以选择一个或多个数据项,以及在多个数据项选择中,选 ...
- PyQt(Python+Qt)学习随笔:利用QWidget部件的palette以及ColorGroup、colorRole局部调整部件的特定范围颜色
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<PyQt(Python+Qt)学习随笔:QWidget部件的 ...
- PyQt(Python+Qt)学习随笔:视图中的dragDropMode属性对dragEnabled和acceptDrops属性的影响
老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系&g ...
随机推荐
- C++实现管理系统
概述 系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人,信息包括(姓名.性别.年龄.联系电话.家庭住址)最多记录1000人 显示联系人:显示通讯录中所有的联系人信息 删除联系人:按照姓名进行 ...
- Java--关于cpu占用解决方案
关于cpu占用高的解决方案--java篇 通俗一点:找到进程,找到下面的线程,找到线程正在做的事,分析线程正在做的事. 一.查看cpu占用高的进程 top命令可以查看(假设%cpu已经属于很高了,我们 ...
- 25个Android酷炫开源UI框架
1.Side-Menu.Android 分类侧滑菜单,Yalantis 出品.项目地址:https://github.com/Yalantis/Side-Menu.Android2.Context-M ...
- 内网渗透 day11-免杀框架
免杀框架 目录 1. venom框架 2. shelltel框架 3. backdoor factory(BDP) 1. venom框架 cd venom进入venom文件夹中./venom.sh进入 ...
- JS中的Array之方法(1)
a=[2,4,5,6,7,90]; [1]. a.toString(); // 返回字符串表示的数组,逗号分隔 "2,4,5,6,7,90" [2]. a.join('||'); ...
- 手把手教你使用Vuex(四)
3.Action Action类似于mutation,不同之处在于: Action提交的是mutation,而不是直接变更状态 Action可以包含任何异步操作 可以理解为将mutations里面处理 ...
- 极客mysql38
InnoDB 引擎把数据放在主键索引上,其他索引上保存的是主键 id.这种方式,我们称之为索引组织表(Index Organizied Table). 而 Memory 引擎采用的是把数据单独存放,索 ...
- Python项目1:自动添加标签
本项目取材自<Python基础教程(第三版)>人民邮电出版社 目标: 本项目给纯文本文件添加格式,使文档转换成其他类型的文档(以HTML为例) 思路: 从原文件提取有用信息: 文档结构-- ...
- 剑指offer刷题(栈、堆、 队列、 图)
Stack & Queue 005-用两个栈实现队列 题目描述 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 push 和 pop ,分别完成在队列尾部插入整数和在队列头部删除整数 ...
- Centos7下Jewel版本radosgw服务启动
前言 本篇介绍了centos7下jewel版本的radosgw配置,这里的配置是指将服务能够正常起来,不涉及到S3的配置,以及其他的更多的配置,radosgw后面的gw就是gateway的意思,也就是 ...