【Qt】【模型-视图架构】代理模型示例

文章目录

  • 1. 基本排序/过滤模型Basic Sort/Filter Model Example
  • 2. 自定义排序/过滤模型Custom Sort/Filter Model Example
    • FilterLineEdit类定义及实现
    • MySortFilterProxyModel类定义及实现

1. 基本排序/过滤模型Basic Sort/Filter Model Example

官方提供的基本排序/过滤模型示例说明了如何使用QSortFilterProxyModel执行基本的排序和过滤。

窗口界面显如下:

基本代理模型示例

在继承QWidget类的子类Widget中设计显示。从界面上可以看出总共有两个QGroupBox。上方的QGroupBox中是显示原始模型的树试图,下方的QGroupBox中是显示代理模型的树视图,并且可以交互式地选择使用的过滤模式、语法、哪一列、大小写是否敏感。

代码中,Widget类提供一个公共的函数setSourceModel(),在创建Widget对象后未显示窗口前,调用该函数,为两个树视图设置数据模型。

在main.cpp中向模型中添加数据。

参考官方示例编写的代码参考:https://github.com/Innern/Qt/tree/master/ModelView/Examples/02_BasicSortFilterModel。

官方示例中Sorted/filtered Model组合框中使用的是网格布局,参考代码中使用垂直布局。

2. 自定义排序/过滤模型Custom Sort/Filter Model Example

官方提供的Custom Sort/Filter Model Example说明了如何使用QSortFilterProxyModel的子类为试图提供代理模型。

代理模型通过将源模型的索引映射到对应于不同位置的新索引供试图使用,从而转换源模型的结构。

如下图是基本排序/过滤模型与自定义排序/过滤模型示例应用程序窗口界面:

自定义代理模型示例

自定义代理模型中包括三个类:

  • FilterLineEdit,继承自QLineEdit类,实现行编辑器的更多操作,如上右图的Filter pattern设置。
  • MySortFilterProxyModel类继承自QSortFilterProxyModel,提供一个自定义的代理模型;
  • Widget类提供主窗口界面显示

FilterLineEdit类定义及实现

FilterLineEdit继承自QLineEdit,子类化行编辑器。

该类在左侧提供了一个工具按钮,该工具按钮包含一个菜单栏,菜单栏中可以选择过滤模型的模式。

使用Q_PROPETRY宏声明了支持元对象系统的属性,如下:

    Q_OBJECTQ_PROPERTY(Qt::CaseSensitivity caseSensitivity READ caseSensitivity WRITE setCaseSensitivity)Q_PROPERTY(PatternSyntax patternSyntax READ patternSyntax WRITE setPatternSyntax)
public:explicit FilterLineEdit(QWidget *parent = nullptr);Qt::CaseSensitivity caseSensitivity() const;void setCaseSensitivity(Qt::CaseSensitivity caseSensitivity);enum PatternSyntax{RegularExpression,Wildcard,FixedString};Q_ENUM(PatternSyntax)PatternSyntax patternSyntax() const;void setPatternSyntax(PatternSyntax syntax);

提供信号filterChanged(),当文本内容改变或选择的过滤选项改变时,触发该信号。

MySortFilterProxyModel类定义及实现

MySortFilterProxyModel类继承自QSortFilterProxyModel类。QAbstractProxyModel及其子类是从QAbstractItemModel派生来的,关于普通模型子类化的许多相同建议也适用于代理模型。

QSortFilterProxyModel的许多默认函数实现都是为了调用相关源模型中的等效函数而编写的。对于具有更复杂行为的源模型,可能需要覆盖这种简单的代理机制。

MySortFilterProxyModel类从QSortFilterProxyModel类派生,以确保筛选器能够识别有效的日期范围,并控制排序行为。

MySortFilterProxyModel类定义如下:

class MySortFilterProxyModel : public QSortFilterProxyModel
{Q_OBJECT
public:explicit MySortFilterProxyModel(QObject *parent = nullptr);QDate filterMinimumDate() const;void setFilterMinimumDate(const QDate &date);QDate filterMaximumDate() const;void setFilterMaximumDate(const QDate &date);protected:// 仅接受具有有效日期的行bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;// 使模型能够按照发件人的电子邮件地址对其排序。bool lessThan(const QModelIndex &source_left, const QModelIndex &source_right) const override;private:// 判断输入的日期是否有效bool dateInRange(const QDate &date) const;private:QDate minimumData;QDate MaximumDate;
};

详细代码参考:https://github.com/Innern/Qt/tree/master/ModelView/Examples/03_CustomSortFilterModel

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

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

相关文章

docker镜像体积优化攻略参考—— 筑梦之路

简单介绍 镜像的本质是镜像层和运行配置文件组成的压缩包,构建镜像是通过运行 Dockerfile 中的 RUN 、COPY 和 ADD 等指令生成镜像层和配置文件的过程。 和镜像体积大小有关的关键点: RUN、COPY 和 ADD 指令会在已有镜像层的基础上创建一个新的镜像层&…

【数据结构】详解二叉树

文章目录 1.树的结构及概念1.1树的概念1.2树的相关结构概念1.3树的表示1.4树在实际中的应用 2.二叉树的结构及概念2.1二叉树的概念2.2特殊的二叉树2.2.1满二叉树2.2.2完全二叉树 2.3 二叉树的性质2.4二叉树的存储结构2.4.1顺序结构2.4.2链表结构 1.树的结构及概念 1.1树的概念…

基于SSM的车辆租赁管理系统(含源码+sql+视频导入教程)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于SSM的车辆租赁管理系统1拥有两种角色 管理员:用户管理、用户租车、用户换车和车辆入库、添加汽车、添加客户、生成出租单、客户选车、出租单管理、查询出租单、角色权限管…

登录校验及全局异常处理器

登录校验 会话技术 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束.在一次会话中可以包含多次请求和响应会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话请求间共享数据会话跟踪方案 客户端…

关于MD5

首先还是介绍一下关于md5的基本信息: MD5(Message Digest Algorithm 5)是一种常用的哈希函数,用于产生128位(16字节)的哈希值,通常以32个十六进制数字表示。MD5广泛用于计算文件或文本数据的校…

分享一个 ASP.NET Web Api 上传和读取 Excel的方案

前言 许多业务场景下需要处理和分析大量的数据,而 Excel 是业务人员常用的数据表格工具,因此,将 Excel 表格中内容上传并读取到网站,是一个很常见的功能,目前有许多成熟的开源或者商业的第三方库,比如 NPO…

香港电讯荣获经济通「金融科技大奖」专业认可

香港电讯非常荣幸在《经济通》举办的「2023金融科技大奖」中脱颖而出,获「杰出跨境数码方案」、「杰出网络安全方案(商用)」和「杰出ESG解决方案」三个重要奖项。 香港电讯拥有丰富的经验及庞大的专业技术团队,一直致力为客户提供…

Spring Security3.0版本

前言: 核心: A >> ? >> B ?代表判断层,由Security实现 这是之前的版本浓缩,现在3.0版本添加了更匹配的内容描写,匹配了mvc模式 非mvc模式 核心:client&#x…

scp:Linux系统本地与远程文件传输命令

scp 是Linux系统中用于在本地主机和远程主机之间进行文件传输的命令。 详细说明: scp 命令用于安全地将文件从一个主机传输到另一个主机,所有传输数据都是加密的。语法: scp [参数] [源文件路径] [目标主机:目标路径] 参数说明&#xff1a…

2024-05-31 blue-VH-driver-问题分析-有状态的服务-状态的处理

摘要: VH的driver对上层提供的接口,是会保持状态。这个状态,可以分为,查询的数据的状态,主要是为了提供翻页查询的功能。另一种状态,就是订阅。 有状态的服务: 状态是什么? 其实从调用方的角度更好的理解&#xff0c…

【仿真设计】基于STM32的畜牧动物定位及行为检测设计的Proteus仿真

基于STM32的畜牧动物定位及行为检测设计的Proteus仿真 所需器件: Proteus版本:8.15 整体功能: STM32为主控芯片。温度采集并显示到OLED屏幕上进行监测(DS18B20传感器)。 判定条件:默认为上限为40度&…

数据结构:堆的保姆级教学指南

✨✨小新课堂开课了,欢迎欢迎~✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 小新的主页:编程版小新-CSDN博客 1.堆的概念 堆是一种特殊的树结构,通常用…

【爱空间_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

C#【进阶】排序进阶

排序进阶 文章目录 插入排序希尔排序归并排序快速排序堆排序 插入排序 #region 知识点一 插入排序的基本原理 // 8 7 1 5 4 2 6 3 9 // 两个区域 // 排序区 // 未排序区 // 用一个索引值做分水岭// 未排序区元素 // 与排序区元素比较 // 插入到合适位置 // 直到未排序区清空 #e…

git使用流程与规范

原文网址:git代码提交流程与规范-CSDN博客 简介 本文git提交流程与规范是宝贵靠谱的经验,它能解决如下问题: 分支差距过大,导致合代码无数的冲突合完代码后发现代码丢失分支不清晰,无法追溯问题合代码耗时很长&…

数据结构的快速排序(c语言版)

一.快速排序的概念 1.快排的基本概念 快速排序是一种常用的排序算法,它是基于分治策略的一种高效排序算法。它的基本思想如下: 从数列中挑出一个元素作为基准(pivot)。将所有小于基准值的元素放在基准前面,所有大于基准值的元素放在基准后面。这个过程称为分区(partition)操作…

Redis 和 Mysql 如何保证两者数据一致性

文章目录 概述解决方案消息队列异步重试 基于 RocketMQ 的可靠性消息通信,来实现最终一致Canal 组件,监控 Mysql 中 binlog 的日志,把更新后的数据同步到 Redis 里面延时双删弱一致性和强一致性Canal详解 概述 在分布式系统中,保…

失之毫厘差之千里之load和loads

起源 最近在读pandas库的一些文档的时候,顺便也会将文档上的一些demo在编辑器中进行运行测试,其中在读到pandas处理Json数据这一节的时候,我还是像往常一样,将文档提供的demo写一遍,结果在运行的时候,直接…

【React篇】组件错误边界处理(组件错误引起的页面白屏)

我们知道在生产环境react错误会导致整个页面崩溃,显示为空白页面。 比如下图的错误,导致了左侧页面直接白屏: 由于某一个组件报错导致整个页面崩溃是很严重的问题,那么我们应该如何去降低代码报错带来的影响呢? 我们…

用HAL库改写江科大的stm32入门-6-3 PWM驱动LED呼吸灯

接线图: 2 :实验目的: 利用pwm实现呼吸灯。 关键PWM定时器设置: 代码部分: int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*…