一、概述

在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. leetcode 38:path-sum

    题目描述 给定一个二叉树和一个值sum,判断是否有从根节点到叶子节点的节点值之和等于sum的路径, 例如: 给出如下的二叉树,sum=22,              5              / ...

  2. iOS开发 objective C 代码布局

    代码布局抛弃storyboard,用代码生成界面,它的优劣不谈 首先在项目设置中,更改应用的"入口" 不选main,清空它 然后在AppDelegate.m中,更改(添加内容),别 ...

  3. JS基础算法题(二)

    1.1 数组去重的五种方法 数组去重:将数组中重复的元素去掉 JS数组没有删除具体元素的删除(只能删掉值,删不掉元素的索引),可以使用另外一个结构来进行存储 新数组 新对象 JS数组虽然本质可以删除第 ...

  4. vbox复制虚拟机之后修改ethx号使得可以上网

    vbox复制虚拟机之后修改ethx号使得可以上网: (1).改硬件mac编号[此项需要重启] vi /etc/udev/rules.d/70-persistent-net.rules 然后删掉上面一行 ...

  5. Life is Strange 完结感想

    Life is Strange 是一款剧情游戏.steam上第一章是免费的,也正是因为这个我才开始了解到这个游戏,玩完第一章后觉得还可以,就趁打折花了17块钱买了2-5章.应该是18年6月20号买的, ...

  6. JAVA内存模型和Happens-Before规则

    前言 上一篇文章王子给大家介绍了并发编程中比较关心的三个核心问题,可见性.有序性和原子性. 今天我们继续来探索并发编程的内容,聊一聊JAVA的内存模型和Happens-Before规则. JAVA内存 ...

  7. spring中的事务有两种方式

    1种是我们常用的声明式事务,如注解,或者配置文件配置的. 2种是编程式事务,如 TransactionTemplate 类的使用.

  8. Ceph Bluestore首测

    Bluestore 作为 Ceph Jewel 版本推出的一个重大的更新,提供了一种之前没有的存储形式,一直以来ceph的存储方式一直是以filestore的方式存储的,也就是对象是以文件方式存储在o ...

  9. 每天一个linux命令之stat

    [Linux]Linux下使用stat命令所显示出来的三个时间 转 https://blog.csdn.net/pointer_y/article/details/54347968 在linux系统下 ...

  10. git 最新笔记,工作中的必会技能

    1.状态查看: git status 可以查看工作区,暂存区的状态 untracked 在暂存区没有该文件 modified 修改过 staged 使用git add 暂存过 2.添加操作: git ...