【Qt】【模型/视图】代理模型

文章目录

  • 代理模型简单介绍
  • QSortFilterProxyModel类简单介绍
    • 排序
    • 过滤
    • 子类化

代理模型简单介绍

代理模型的作用是可以将一个模型中的数据进行排序或者过滤,然后提供给视图进行显示。

如下所示,创建一个源模型、一个代理模型,界面上创建一个列表视图;设置代理模型的源模型,并设置列表视图的模型为代理模型。

    // 源数据模型模型QStringList list;list << "yafei" << "yafeilinux" << "Qt" << "Qt Creator";QStringListModel *listModel = new QStringListModel(list, this);filterModel = new QSortFilterProxyModel;// 为代理模型设置源模型filterModel->setSourceModel(listModel);// 列表视图设置数据模型ui->listView->setModel(filterModel);

进行过滤时可以调用代理模型的setFilterRegExp()、setFilterRegularExpression()等函数。如下:

  filterModel->setFilterRegularExpression(ui->lineEdit->text());

QSortFilterProxyModel类简单介绍

QSortFilterProxy类支持对另一个模型进行排序和过滤。

代理模型通过将源模型的索引映射到对应新的索引,从而转换源模型的结构。对于视图来说,这种方法允许对给定的源模型进行重构,而不需要对底层数据进行任何转换,也不需要在内存中复制数据。

比如要对自定义模型提供的项进行排序和筛选。不进行排序和筛选的情况下,用于设置模型和视图的代码如下:

    QTreeView *treeView = new QTreeView(this);MyItemModel *myModel = new MyItemModel(this);treeView->setModel(myModel);

为MyItemModel添加排序和筛选支持的话,需要创建一个QSortFilterProxyModel对象,并调用setSourceModel()函数设置源模型,在视图上设置代理模型对象,如下:

    QTreeView *treeView = new QTreeView(this);MyItemModel *myModel = new MyItemModel(this);QSortFilterProxyModel *filterModel = new QSortFilterProxyModel;filterModel->setSourceModel(myModel);treeView->setModel(filterModel);

如果仅有以上的代码,此时视图显示既不会排序也不会筛选,上述代码只是提供了排序和筛选功能的支持。还需要调用setSort*setFilter*开头的函数进行排序和筛选。

代理模型做的任何更改都会应用于源模型

QSortFilterProxyModel作为源模型的包装器,如果需要将源QModelIndexes转换为已经排序或过滤的模型的索引,或者反之,可以使用mapToSource()、mapFromSource()、mapSelectionToSource()和mapSelectionFromSource()等函数。

默认情况下,只要源模型发生更改,模型就会动态地对数据进行重新排列和重新筛选。可以通过设置dynamicSortFilter属性更改此行为。

排序

QTreeView和QTableView类具有sortingEnabled属性,该属性控制用户是否可以通过单击视图的水平标题对视图进行排序。

设置sortingEnabled属性为true,单击标题部分会根据该列对项目进行排序,重复单击,用户可以在升序和降序之间交替排列。

视图调用模型上的sort()虚函数重新排序模型中的数据。对于自定义模型类,可以重新实现**sort(),**也可以使用QSortFilterProxyModel来包装自定义的模型,因为QSortFilterProxyModel提供了一个通用的sort()函数,它对项的setRole()进行操作,并识别几种数据类型,包括int、QString和QDateTime。

对于层次模型,排序递归应用于所有子项。

默认情况下,字符串比较区分大小写,可以通过设置sortCaseSensityvity属性更改。

自定义的排序行为通过子类化QSortFilterProxyModel并重新实现用于比较项的lessThan()函数来实现。

排序的另一种方法是禁用对视图的排序,并将某个顺序强加给用户,这是通过显式调用sort()函数来完成的。

当设置参数按列-1排序时,将返回到基础源模型的排列顺序。

过滤

除了排序之外,QSortFilterProxyModel还可以用于隐藏与某个筛选器不匹配的项。

该筛选器使用QRegExp对象指定,并应用于给定列的每个项的filterRole(),默认情况下为Qt::DisplayRole。QRegExp对象可用于匹配正则表达式、通配符模式或固定字符串。

如下:

   filterModel->setFilterRegExp(QRegExp(".png", Qt::CaseInsensitive, QRegExp::FixedString));  // 设置过滤器filterModel->setFilterKeyColumn(1);  // 设置过滤器作用的列

对于层次模型来说,过滤器递归地应用于所有子级。如果父项与筛选器不匹配,则不会显示其任何子项。

比较常见的用法是让用户在QLineEdit中指定过滤器的正则表达式、通配符模式或固定字符串,并将textChanged()信号连接到setFilterRegularExpression()、setFilterWildcard()或setFilterFixedString()来重新应用过滤器。

对于自定义的过滤行为,可以重新实现filterAcceptsRow()和filterAcceptColumn()函数。

如果处理大量的过滤,并且必须重复调用invalidFilter(),根据模型的实现情况,使用reset()可能会更高效。但是需要注意,reset()会将代理模型返回到其原始状态,从而丢失选择信息,并将导致代理模型重新填充。

子类化

由于QSortFilterProxyModel及其子类是从QAbstractItemModel派生的,因此关于将正常模型子类化的许多相同建议也适用于代理模型。

另外需要注意的是,该类中函数的许多默认实现是为了调用相关源模型中的等效函数而编写的。

对于具有更复杂行为的源模型,可能需要覆盖这种简单的代理机制,比如,如果源模型提供了一个自定义的hasChild()实现,那么也应该在代理模型中提供一个。

注意1:使用Qt5,通过QRegularExpression类改进了对正则表达式的支持。Qt5以后的版本应考虑弃用QRegExp API,使用QRegularExpression API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/18570.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Python库] pyudev

[Python库] pyudev ​pyudev​是什么 ​pyudev​是libudev​的python版本&#xff0c;而libudev​是linux的设备和硬件管理库。 pyudev支持libudev的所有功能&#xff0c;可以通过官方提供的接口枚举设备、查找设备属性或者监听设备状态&#xff0c;包括异步监听。 资料&#x…

【TCP协议中104解析】wireshark抓取流量包工具,群殴协议解析基础

Tcp ,104 ,wireshark工具进行解析 IEC104 是用于监控和诊断工业控制网络的一种标准&#xff0c;而 Wireshark则是一款常用的网络协议分析工具&#xff0c;可以用干解析TEC104 报文。本文将介绍如何使用 Wireshark解析 IEC104报文&#xff0c;以及解析过 程中的注意事项。 一、安…

AI图书推荐:用ChatGPT和Python搭建AI应用来变现

《用ChatGPT和Python搭建AI应用来变现》&#xff08;Building AI Applications with ChatGPT API&#xff09;将ChatGPT API与Python结合使用&#xff0c;可以开启构建非凡AI应用的大门。通过利用这些API&#xff0c;你可以专注于应用逻辑和用户体验&#xff0c;而ChatGPT强大的…

[大师C语言(第十四篇)]C语言数据结构技术详解

引言 数据结构是计算机科学中的一个基础概念&#xff0c;它涉及数据组织和访问方法的设计。在C语言中&#xff0c;数据结构的使用可以提高程序的效率和可读性。本文将深入探讨C语言数据结构背后技术&#xff0c;并通过详细的代码案例&#xff0c;展示C语言在数据结构中的应用和…

Axios的使用简单说明

axios 请求方式和参数 axios 可以发送 ajax 请求&#xff0c;不同的方法可以发送不同的请求: axios.get&#xff1a;发送get请求 axios.post&#xff1a;发送post请求 axios.put&#xff1a;发送put请求 axios.delete&#xff1a;发送delete请求 无论哪种方法&#xff0c;第一…

【2】:向量与矩阵

向量 既有大小又有方向的量叫做向量 向量的模 向量的长度 单位向量 (只表示方向不表示长度) 向量的加减运算 向量求和 行向量与列向量的置换 图形学中竖着写 向量的长度计算 点乘&#xff08;计算向量间夹角&#xff09; 点乘满足的运算规律 交换律、结合律、分配…

单例模式(Java实现)

1. 懒汉式线程不安全 public class LazyUnsafeSingleton {private static LazyUnsafeSingleton singleton;private LazyUnsafeSingleton(){}public static LazyUnsafeSingleton getInstance() {if (singleton null) singleton new LazyUnsafeSingleton();return singleton;}…

MouseBoost Pro for Mac v3.4.7 鼠标右键助手 安装教程【支持M芯片】

MouseBoost Pro for Mac v3.4.7 鼠标右键助手 安装教程【支持M芯片】 原文地址&#xff1a;https://blog.csdn.net/weixin_48311847/article/details/139201501

Kibana创建ElasticSearch 用户角色

文章目录 1, ES 权限参考2, 某应用的管理员权限&#xff1a;可以open/close/delete/cat/read/write 索引3, 某应用的读写权限&#xff1a;可以cat/read/write 索引 &#xff08;不能删除索引或数据&#xff09;4, 某应用的只读权限 1, ES 权限参考 https://www.elastic.co/gui…

Notepad++不显示CRLF的方法

View -> Show Symbol -> 去掉勾选 Show All Characters

【教程】PaddleOCR高精度文字识别

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ PaddleOCR/doc/doc_ch/quickstart.md at main PaddlePaddle/PaddleOCR GitHub 安装 pip install paddlepaddle -i https://mirror.baidu.com/pypi/s…

C++是微软发明的吗?为什么会有这么多的编译器?哪个才是官方的

C现在由C标准委员会维护。称作标准C。C标准委员会只是定义C的标准&#xff0c;具体的实现需要各个编译器厂商去实现&#xff0c;如微软实现的C版本为VC。Borland公司实现的是BC。各个编译器基本是遵循C标准的。仅有很小的一部分不同。 C不是微软发明&#xff0c;C是语言 但是有…

新版idea配置git步骤及项目导入

目录 git安装 下载 打开git Bash 配置全局用户名及邮箱 查看已经配置的用户名和邮箱 在IDEA中设置Git 问题解决 项目导入 git安装 下载 进入官网 Git - Downloads 点击所属本机系统&#xff0c;window如下图 选择64位安装 按照默认步骤一直下一步即可 打开git Bash …

HackTheBox-Machines--Beep

Beep测试过程 1 信息收集 nmap端口扫描 gryphonwsdl ~ % nmap -sC -sV 10.129.137.179 Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-28 14:39 CST Nmap scan report for 10.129.229.183 Host is up (0.28s latency). Not shown: 988 closed tcp ports (conn-refused…

Nacos 2.x 系列【12】配置加密插件

文章目录 1. 前言2. 安装插件2.1 编译2.2 客户端2.3 服务端 3. 测试 1. 前言 为保证用户敏感配置数据的安全&#xff0c;Nacos提供了配置加密的新特性。降低了用户使用的风险&#xff0c;也不需要再对配置进行单独的加密处理。 前提条件&#xff1a; 版本:老版本暂时不兼容&…

Leetcode621. 任务调度器

Every day a Leetcode 题目来源&#xff1a;621. 任务调度器 类似题目&#xff1a;1953. 你可以工作的最大周数 解法1&#xff1a;贪心 本质上来说&#xff0c;我们需要构造一个尽量短的&#xff0c;相同元素间隔 > (n1) 的序列。 用一个数组 cnt 统计每个任务的次数。…

【御控工业物联网】 Java JSON结构转换、JSON结构重构、JSON结构互换(17):数组To对象——键值互换属性重组

文章目录 一、JSON结构转换是什么&#xff1f;二、核心构件之转换映射三、案例之《JSON数组 To JSON对象》四、代码实现五、在线转换工具六、技术资料 一、JSON结构转换是什么&#xff1f; JSON结构转换指的是将一个JSON对象或JSON数组按照一定规则进行重组、筛选、映射或转换…

介绍Django Ninja框架

文章目录 安装快速开始特性详解自动文档生成定义请求和响应模型异步支持中间件支持测试客户端 结论 Django Ninja是一个基于Python的快速API开发框架&#xff0c;它结合了Django和FastAPI的优点&#xff0c;提供了简单易用的方式来构建高性能的Web API。 安装 使用以下命令安…

CSS 介绍及用法,常用属性

一、CSS介绍 A. 简介 CSS全称&#xff1a;全称为层叠样式表&#xff08;Cascading Style Sheets&#xff09;&#xff0c;是一种用于描述网页外观和格式的计算机语言。CSS可以使网页的布局更加丰富和多样化&#xff0c;并且可以将样式信息与网页内容分离&#xff0c;使得网…

如何防止重复提交请求?

下面说的防重操作&#xff0c;如支付功能订单提交业务、表单提交、手机验证码功能。 订单提交为什么需要防重呢&#xff1f;想像一下你在商城购物&#xff0c;你选中商品点击提交订单&#xff0c;如果这时网络延迟没有返回成功提示&#xff0c;你又多点了几次。每点一次都会发送…