一、概述

在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的更多相关文章

  1. 第15.28节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTableWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 表格部件为应用程序提供标准的表格显示工具,在表格内可以管理基于行和列的数据项,表格中的最大 ...

  2. 第15.27节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTreeWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 树部件(Tree Widget)是Qt Designer中 Item Widgets(It ...

  3. 第15.26节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QListWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 列表部件(List Widget)对应类QListWidget,是从QListView派生 ...

  4. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性不能覆盖写的问题

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dra ...

  5. PyQt(Python+Qt)学习随笔:视图中类QAbstractItemView的dragDropOverwriteMode属性

    老猿Python博文目录 老猿Python博客地址 一.属性的作用 dragDropOverwriteMode属性用于控制视图的拖放行为,如果其值为True,则视图中选定的数据将在拖拽数据放下时被覆盖 ...

  6. PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled属性的困惑

    老猿Python博文目录 老猿Python博客地址 dragEnabled属性用于控制视图是否支持拖拽,可以通过dragEnabled().setDragEnabled(bool enable)进行属 ...

  7. PyQt(Python+Qt)学习随笔:QAbstractItemView的selectionMode属性

    老猿Python博文目录 老猿Python博客地址 一.概述 selectionMode属性用于控制view中操作选择数据项的模式,用于控制用户是否可以选择一个或多个数据项,以及在多个数据项选择中,选 ...

  8. PyQt(Python+Qt)学习随笔:利用QWidget部件的palette以及ColorGroup、colorRole局部调整部件的特定范围颜色

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 在<PyQt(Python+Qt)学习随笔:QWidget部件的 ...

  9. PyQt(Python+Qt)学习随笔:视图中的dragDropMode属性对dragEnabled和acceptDrops属性的影响

    老猿Python博文目录 老猿Python博客地址 在<PyQt(Python+Qt)学习随笔:QAbstractItemView的dragEnabled和dragDropMode属性的关系&g ...

随机推荐

  1. c#练习习题:while循环

    2006年培养学员80000人,每年增长25%,请问按此增长速度,到哪一年培训学员人数将达到20万人? int count = 80000; int year = 2006; while (count ...

  2. 利用 Docker 构建一个简单的 java 开发编译环境

    目前 Java 语言的版本很多,除了常用的 Java 8,有一些遗留项目可能使用了 Java 7,也可能有一些比较新的的项目使用了 Java 10 以上的版本.如果想切换自己本地的 Java 开发环境 ...

  3. 常用DOS指令

    Windows的DOS命令,其实是Windows系统的cmd命令,它是由原来的MS-DOS系统保留下来的. ​MS-DOS称为微软磁盘操作系统,最开始从西雅图公司(蒂姆·帕特森)买过来 MS-DOS系 ...

  4. 模拟微信小程序页面Page方法

    1.依赖 a.jQuery b.angularjs 2.page.js文件 1 var Page = function (options) { 2 var myApp = angular.module ...

  5. Kubernetes笔记(六):了解控制器 —— Deployment

    Pod(容器组)是 Kubernetes 中最小的调度单元,可以通过 yaml 定义文件直接创建一个 Pod.但 Pod 本身并不具备自我恢复(self-healing)功能.如果一个 Pod 所在的 ...

  6. ceph erasure默认的min_size分析

    引言 最近接触了两个集群都使用到了erasure code,一个集群是hammer版本的,一个环境是luminous版本的,两个环境都出现了incomplete,触发的原因有类似的地方,都是有osd的 ...

  7. Django 配置 Mysql

    先安装mysqlclient pip install mysqlclient sttings中的 DATABASES = { 'default': { 'ENGINE': 'django.db.bac ...

  8. python 学习代码

    1 #-- 寻求帮助: 2 dir(obj) # 简单的列出对象obj所包含的方法名称,返回一个字符串列表 3 help(obj.func) # 查询obj.func的具体介绍和用法 4 5 #-- ...

  9. HDU100题简要题解(2040~2049)

    HDU2040 亲和数 题目链接 Problem Description 古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为: 1+2+4+5+10+11+20+2 ...

  10. DDD(领域驱动设计)--战略设计

    领域 领域是一个组织所做的事情以及其中所包含的一切.商业机构通常会确定一个市场,然后在这个市场中销售产品和服务.每个组织都有它自己的业务范围和做事方式. 领域就是解决一个特定范围内的业务问题. 如何分 ...