当前位置: 首页 > news >正文

【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()实现,那么也应该在代理模型中提供一个。

子类化时可能需要实现一下几个函数:

virtual bool filterAcceptsColumn(int source_column, const QModelIndex &source_parent) const;
virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;
virtual bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const;
  • filterAcceptsColumn():如果给定的source_column和source_parent指示的列中的项应该包含在模型中,返回true,否则返回false。
  • filterAcceptsRow():如果给定的source_row和source_parent指示的行中的项应该包含在模型中,返回true,否则返回false。
  • lessThan():如果给定索引source_left引用的项的值小于给定索引source_right引用的项值,返回true,否则返回false。

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

相关文章:

【Qt】【模型视图架构】代理模型

文章目录 代理模型简单介绍QSortFilterProxyModel类简单介绍排序过滤子类化 代理模型简单介绍 代理模型的作用是可以将一个模型中的数据进行排序或者过滤&#xff0c;然后提供给视图进行显示。 如下所示&#xff0c;创建一个源模型、一个代理模型&#xff0c;界面上创建一个列…...

Flutter 中的 IconTheme 小部件:全面指南

Flutter 中的 IconTheme 小部件&#xff1a;全面指南 Flutter 是一个功能丰富的 UI 开发框架&#xff0c;它允许开发者使用 Dart 语言来构建跨平台的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;IconTheme 是一个用于设置应用中图标主题的小部件&#xff0c;…...

virtualbox虚拟机、centos7安装增强工具

文章目录 1. virtualBox语言设置2. 设置终端启动快捷键3. 添加virtualbox 增强工具4. 设置共享文件夹 1. virtualBox语言设置 virtualbox -> file -> perferences -> language ->选择对应的语言 -> OK virtualbox -> 管理 -> 全局设定 -> 语言 -> …...

Kotlin 泛型

文章目录 定义泛型属性泛型函数泛型类或接口 where 声明多个约束泛型具体化in、out 限制泛型输入输出 定义 有时候我们会有这样的需求&#xff1a;一个类可以操作某一类型的对象&#xff0c;并且限定只有该类型的参数才能执行相关的操作。 如果我们直接指定该类型Int&#xff…...

Tomcat 面试题(一)

1. 简述什么是Tomcat &#xff1f; Tomcat是一个开源的Java Servlet容器&#xff0c;它实现了Java Servlet和JavaServer Pages (JSP)技术&#xff0c;提供了一个运行Java Web应用程序的平台。Tomcat由Apache软件基金会维护&#xff0c;并广泛用于开发和部署Web应用程序。 Tom…...

跟踪一个Pytorch Module在训练过程中的内存分配情况

跟踪一个Pytorch Module在训练过程中的内存分配情况 代码输出 目的:跟踪一个Pytorch Module在训练过程中的内存分配情况 方法: 1.通过pre_hook module的来区分module的边界 2.通过__torch_dispatch__拦截所有的aten算子,计算在该算子中新创建tensor的总内存占用量 3.通过tensor…...

LeetCode 2965.找出缺失和重复的数字:小数据?我选择暴力(附优化方法清单:O(1)空间方法×3)

【LetMeFly】2965.找出缺失和重复的数字&#xff1a;小数据&#xff1f;我选择暴力&#xff08;附优化方法清单&#xff1a;O(1)空间方法3&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-missing-and-repeated-values/ 给你一个下标从 0 开始的二维…...

【运维】VMware Workstation 虚拟机内无网络的解决办法(或许可行)

【使用桥接模式】 【重置网络】 这个过程涉及管理Linux系统中的网络驱动程序和网络管理工具。以下是每个步骤的详细解释&#xff1a; 卸载网络驱动模块&#xff1a; sudo rmmod e1000 sudo rmmod e1000e sudo rmmod igb这些命令使用 rmmod&#xff08;remove module&#xff…...

如何使用Dora SDK完成Fragment流式切换和非流式切换

我想大家对Fragment都不陌生&#xff0c;它作为界面碎片被使用在Activity中&#xff0c;如果只是更换Activity中的一小部分界面&#xff0c;是没有必要再重新打开一个新的Activity的。有时&#xff0c;即使要更换完整的UI布局&#xff0c;也可以使用Fragment来切换界面。 何…...

低代码开发平台(Low-code Development Platform)的模块组成部分

低代码开发平台&#xff08;Low-code Development Platform&#xff09;的模块组成部分主要包括以下几个方面&#xff1a; 低代码开发平台的模块组成部分可以按照包含系统、模块、菜单组织操作行为等维度进行详细阐述。以下是从这些方面对平台模块组成部分的说明&#xff1a; …...

Java网络编程(上)

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:Java文件IO&#x1f649; &#x1f439;今日诗词:来如春梦几多时&#xff1f;去似朝云无觅处&#x1f439; ⛳️点赞 ☀️收藏⭐️关注&#x1f4ac;卑微小博主&a…...

Spring Kafka 之 @KafkaListener 注解详解

我们在开发的过程中当使用到kafka监听消费的时候会使用到KafkaListener注解&#xff0c;下面我们就介绍下它的常见属性和使用。 一、介绍 KafkaListener 是 Spring Kafka 提供的一个注解&#xff0c;用于声明一个方法作为 Kafka 消息的监听器 二、主要参数 1、topic 描述&…...

【量算分析工具-贴地距离】GeoServer改造Springboot番外系列九

【量算分析工具-概述】GeoServer改造Springboot番外系列三-CSDN博客 【量算分析工具-水平距离】GeoServer改造Springboot番外系列四-CSDN博客 【量算分析工具-水平面积】GeoServer改造Springboot番外系列五-CSDN博客 【量算分析工具-方位角】GeoServer改造Springboot番外系列…...

【linux】(1)文件操作及vi

文件和目录的创建 创建文件 touch 命令&#xff1a;创建一个新的空文件。 touch filename.txtecho 命令&#xff1a;创建一个文件并写入内容。 echo "Hello, World!" > filename.txtcat 命令&#xff1a;将内容写入文件。 cat > filename.txt然后输入内容&…...

【5】MySQL数据库备份-XtraBackup - 全量备份

MySQL数据库备份-XtraBackup-全量备份 前言环境版本 安装部署下载RPM 包二进制包 安装卸载 场景分析全量备份 | 恢复备份恢复综合 增量备份 | 恢复部分备份 | 恢复 前言 关于数据库备份的一些常见术语、工具等&#xff0c;可见《MySQL数据库-备份》章节&#xff0c;当前不再重…...

数据治理-数据标准演示

数据字典 数据标准-数据字典 词根 数据标准-词根 业务字典映射 数据标准-业务字典映射 标准文档 数据标准-标准文档...

基于Chisel的FPGA流水灯设计

Chisel流水灯 一、Chisel&#xff08;一&#xff09;什么是Chisel&#xff08;二&#xff09;Chisel能做什么&#xff08;三&#xff09;Chisel的使用&#xff08;四&#xff09;Chisel的优缺点1.优点2.缺点 二、流水灯设计 一、Chisel &#xff08;一&#xff09;什么是Chise…...

LabVIEW齿轮调制故障检测系统

LabVIEW齿轮调制故障检测系统 概述 开发了一种基于LabVIEW平台的齿轮调制故障检测系统&#xff0c;实现齿轮在恶劣工作条件下的故障振动信号的实时在线检测。系统利用LabVIEW的强大图形编程能力&#xff0c;结合Hilbert包络解调技术&#xff0c;对齿轮的振动信号进行精确分析…...

AI帮写:探索国内AI写作工具的创新与实用性

随着AI技术的快速发展&#xff0c;AI写作正成为创作的新风口。但是面对GPT-4这样的国际巨头&#xff0c;国内很多小伙伴往往望而却步&#xff0c;究其原因&#xff0c;就是它的使用门槛高&#xff0c;还有成本的考量。 不过&#xff0c;随着GPT技术的火热&#xff0c;国内也涌…...

n后问题 回溯笔记

问题描述 在nn格的棋盘上放置彼此不受攻击的n个皇后。 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同 一行或同一列或同一斜线上的棋子。n后问题等价于在nn格的棋盘上放置n个皇后&#xff0c;任何2个皇后不放在同一行或同一列或同一斜线上。 代码 import java.uti…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能

指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...

Matlab实现任意伪彩色图像可视化显示

Matlab实现任意伪彩色图像可视化显示 1、灰度原始图像2、RGB彩色原始图像 在科研研究中&#xff0c;如何展示好看的实验结果图像非常重要&#xff01;&#xff01;&#xff01; 1、灰度原始图像 灰度图像每个像素点只有一个数值&#xff0c;代表该点的​​亮度&#xff08;或…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...