【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_OBJECT
    Q_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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

004 仿muduo实现高性能服务器组件_Buffer模块与Socket模块的实现

​🌈个人主页:Fan_558 🔥 系列专栏:仿muduo 🌹关注我💪🏻带你学更多知识 文章目录 前言Buffer模块Socket模块 小结 前言 这章将会向你介绍仿muduo高性能服务器组件的buffer模块与socket模块的实…

打造你的首个QT 5计算器应用

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、引言:QT 5的力量与我们的计算器 二、QT 5基础:理解UI设计与文件…

mac安装allure及allure:command not fund问题解决

一、下载 下载连接:https://github.com/allure-framework/allure2/releases 选择任意压缩包进行下载 二、解压 解压后是一个文件夹 三、打开终端 # bash终端 vim ~/.bash_profile # zsh终端 vim ~/.zshrc四、配置环境变量 export PATH/usr/bin:/bin:/usr/sb…

「浏览器」服务端渲染

前言 服务端渲染(Server-Side Rendering,SSR)是一种常见于网页应用的技术,它指的是在服务器上将网页的内容生成,然后发送完整的HTML页面到客户端的浏览器的过程。这与传统的客户端渲染(Client-Side Render…

LC 旋转 - 模拟对象

原文链接 链接 液晶 (LC) 旋转网格属性允许您以 theta、phi 为单位指定空间变化的 LC 导向。 液晶由杆状分子结构组成,这些分子结构具有相对于长轴的旋转对称性。因此,液晶具有空间变化的单轴光学特性。 相对于分子长轴和分子短轴的折射率称为非寻常 ne …

STM32使用ST-LINK下载程序中需要注意的几点

使用keil5的ST-link下载界面 前提是ST-LINK已经连接好,(下图中是没有连接ST-link设备),只是为了展示如何查看STlink设备是否连接的方式 下载前一定设置下载完成后自启动 这个虽然不是必须,但对立即看到新程序的现象…

python爬取每日天气情况

python爬取每日天气情况 一、项目简介二、完整代码一、项目简介 本次爬取的目标数据来源于天气网,数据所在的页面如下图所示,本次任务较为简单,按照正常操作流程操作即可,即抓包分析数据接口,发送请求获取数据,解析数据并持久化存储。发送请求使用requests库,解析数据使…

2.11 下载安装Oracle数据库(Win10 JP)

2.11 下载安装Oracle数据库 目录一、下载Oracle 11g客户端安装包1. 官网选数据库配置2. Oracle下载器 下载安装包 二、 安装Oracle 11g客户端1. 安装 Oracle Database Client 11.2.0.1.02. 安装 Oracle Database 11.2.0.4.0 for HP OpenVMS Itanium 三、下载Oracle 12c数据库安…

三相智能电表通过Modbus转Profinet网关与PLC通讯案例

Modbus转Profinet网关(XD-MDPN100/300)的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus转Profinet网关集成了Modbus和Profinet两种协议,支持Modbus RTU主站/从站,并可以与RS485接口的设备,它自带网…

C盘文件被格式化了,要怎么恢复?

C盘通常是操作系统(如Windows)的默认安装目录。它包含了操作系统的核心文件、驱动程序及系统所需的各种支持文件。这些文件对于计算机的正常运行至关重要。但在使用的过程中,有时可能会因为各种原因导致C盘被格式化,从而丢失了这些重要文件。这无疑是一个…

定个小目标之每天刷LeetCode热题(5)

今天这是一道简单题,解决方法是递归,遍历二叉树最简便的方法就是递归了,我们以递归三大要素对此题进行简单分析一下 第一要素:明确你这个函数想要干什么 在这道题中,我们需要定义一个传入任意二叉树根节点可以左右翻…

【移动端】商场项目路由设计

1:路由设计配置: 一级路由配置 分析项目,设计路由,配置一级路由 一级路由:单个页面独立展示的,都是一级路由,例如:登录页面,首页架子,报错页面 二级路由&…

Java项目对接redis,客户端是选Redisson、Lettuce还是Jedis?

JAVA项目对接redis,客户端是选Redisson、Lettuce还是Jedis? 一、客户端简介1. Jedis介绍2. Lettuce介绍3. Redisson介绍 二、横向对比三、选型说明 在实际的项目开发中,对于一个需要对接Redis的项目来说,就面临着选择合适的Redis客…

基于Vue+Node.js的购物网站设计与实现-计算机毕业设计源码28500

摘 要 近年来,随着移动互联网的快速发展,电子商务越来越受到网民们的欢迎,电子商务对国家经济的发展也起着越来越重要的作用。简单的流程、便捷可靠的支付方式、快捷畅通的物流快递、安全的信息保护都使得电子商务越来越赢得网民们的青睐。现…

将局部变量指针传递给某个c++类,离开类时数据发生变化

最近遇到一个c的问题,将一个局部变量的值传递给某个类,类中没有对该数据进行任何显式修改,结果该变量的值发生变化并且不可访问。 我开始很奇怪为何会发生这样的事情,后来经过调试,发现原来是该类发生了异常&#xff…

迅为RK3562开发板专为3562编写10大分类2900+页文档

iTOP-3562开发板采用瑞芯微RK3562处理器,内部集成了四核A53Mali G52架构,主频2GHZ,内置1TOPSNPU算力,RK809动态调频。支持OpenGLES1.1/2.0/3.2、0penCL2.0、Vulkan 1.1内嵌高性能2D加速硬件。 内置独立NPU, 算力达 1TOPS,可用于轻…

中学生学人工智能系列:如何用AI学化学

经常有读者朋友给公众号《人工智能怎么学》留言咨询如何使用人工智能学习语文、数学、英语、化学等科目。这些都是中学教师、中学生朋友及其家长们普遍关注的问题。仅仅使用留言回复的方式,不可能对这些问题做出具体和透彻的解答,因此本公众号近期将推出…

【Linux基础】Linux了解、安装centos虚拟机

【Linux基础】Linux了解、安装centos虚拟机 文章目录 【Linux基础】Linux了解、安装centos虚拟机1、什么是Linux2、Linux安装2.1、使用VMware安装Linux centos72.2、启动虚拟机安装 1、什么是Linux Linux是一套免费使用和自由传播的操作系统。说到操作系统,大家比较…

【深度强化学习】如何平衡cpu和gpu来加快训练速度(实录)

文章目录 问题抛出问题展示 问题探索参考:如何平衡cpu和gpu来加快训练速度呢? 解决问题实现逻辑:PPO算法示例:偷懒改法:第三处修改再次修改--24.5.22 不偷懒改法修改总结1 最终成绩(不是)附加赛…

(2024,Video2Game,NeRF,Mesh,物理模块,游戏引擎)通过单个视频实现实时、交互、逼真且兼容浏览器的环境

Video2Game: Real-time, Interactive, Realistic and Browser-Compatible Environment from a Single Video 公众号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 2. 相关工作 3. Video…