界面开发框架Qt新手入门 - 自定义排序/筛选模型示例(一)

news2024/11/24 22:54:37

Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

自定义排序/筛选模型示例说明了如何子类化QSortFilterProxyModel来执行高级排序和筛选。

QSortFilterProxyModel类提供了对在另一个模型和视图之间传递的数据进行排序和过滤的支持。

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

自定义排序/筛选模型示例由两个类组成:

  • MySortFilterProxyModel类提供了一个自定义代理模型。
  • Window类提供了主应用程序窗口,使用自定义代理模型对标准项模型进行排序和筛选。

我们将首先查看MySortFilterProxyModel类,了解如何实现自定义代理模型;然后查看Window类,来了解如何使用该模型;最后我们将快速查看main()函数。

点击获取Qt Widget组件下载

MySortFilterProxyModel类定义

MySortFilterProxyModel类继承了QSortFilterProxyModel类。

由于QAbstractProxyModel及其子类派生自QAbstractItemModel,许多关于常规模型子类化的建议也适用于代理模型。

另一方面值得注意的是,QSortFilterProxyModel的许多默认函数实现都是这样编写的,以便它们调用相关源模型中的等效函数。对于具有更复杂行为的源模型,可能需要重写这个简单的代理机制。在本例中,我们从QSortFilterProxyModel类派生出来,以确保我们的过滤器可以识别有效的日期范围,并控制排序操作。

class MySortFilterProxyModel : public QSortFilterProxyModel
{
Q_OBJECT

public:
MySortFilterProxyModel(QObject *parent = nullptr);

QDate filterMinimumDate() const { return minDate; }
void setFilterMinimumDate(QDate date);

QDate filterMaximumDate() const { return maxDate; }
void setFilterMaximumDate(QDate date);

protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
bool lessThan(const QModelIndex &left, const QModelIndex &right) const override;

private:
bool dateInRange(QDate date) const;

QDate minDate;
QDate maxDate;
};

我们希望能够通过指定给定的时间段来过滤数据,因此实现了自定义的setFilterMinimumDate()和setFilterMaximumDate()函数,以及相应的filterMinimumDate()和filterMaximumDate()函数。我们重新实现了QSortFilterProxyModel的filterAcceptsRow()函数,来只接受具有有效日期的行,并且QSortFilterProxyModel::lessThan()能够根据发件人的电子邮件地址对其进行排序。最后,实现了一个dateInRange()方便函数,用于确定日期是否有效。

MySortFilterProxyModel类实现

MySortFilterProxyModel构造函数很简单,它将父形参传递给基类构造函数:

MySortFilterProxyModel::MySortFilterProxyModel(QObject *parent)
: QSortFilterProxyModel(parent)
{
}

MySortFilterProxyModel实现中最有趣的部分是QSortFilterProxyModel的filterAcceptsRow()和lessThan()函数的重新实现,让我们首先看一下定制的lessThan()函数。

bool MySortFilterProxyModel::lessThan(const QModelIndex &left,
const QModelIndex &right) const
{
QVariant leftData = sourceModel()->data(left);
QVariant rightData = sourceModel()->data(right);

我们想按发件人的电子邮件地址对他们进行分类,lessThan()函数在排序时用作<操作符。默认实现处理一个类型集合,包括QDateTime和String,但为了能够根据发件人的电子邮件地址进行排序,我们必须首先在给定的字符串中识别地址:

if (leftData.userType() == QMetaType::QDateTime) {
return leftData.toDateTime() < rightData.toDateTime();
} else {
static const QRegularExpression emailPattern("[\\w\\.]*@[\\w\\.]*");

QString leftString = leftData.toString();
if (left.column() == 1) {
const QRegularExpressionMatch match = emailPattern.match(leftString);
if (match.hasMatch())
leftString = match.captured(0);
}
QString rightString = rightData.toString();
if (right.column() == 1) {
const QRegularExpressionMatch match = emailPattern.match(rightString);
if (match.hasMatch())
rightString = match.captured(0);
}

return QString::localeAwareCompare(leftString, rightString) < 0;
}
}

我们使用qregulareexpression为正在寻找的地址定义一个模式,match()函数返回一个QRegularExpressionMatch对象,其中包含匹配结果,如果有匹配,hasMatch()返回true。匹配的结果可以用QRegularExpressionMatch的capture()函数检索,整个匹配的索引为0,括号内的子表达式的索引从1开始(不包括非捕获括号)。

bool MySortFilterProxyModel::filterAcceptsRow(int sourceRow,
const QModelIndex &sourceParent) const
{
QModelIndex index0 = sourceModel()->index(sourceRow, 0, sourceParent);
QModelIndex index1 = sourceModel()->index(sourceRow, 1, sourceParent);
QModelIndex index2 = sourceModel()->index(sourceRow, 2, sourceParent);

return (sourceModel()->data(index0).toString().contains(filterRegularExpression())
|| sourceModel()->data(index1).toString().contains(filterRegularExpression()))
&& dateInRange(sourceModel()->data(index2).toDate());
}

另一方面,如果给定的行应该包含在模型中,则filterAcceptsRow()函数将返回true。在我们的示例中,如果主题或发送方中有一个包含给定的正则表达式,并且日期有效,则行被接受。

bool MySortFilterProxyModel::dateInRange(QDate date) const
{
return (!minDate.isValid() || date > minDate)
&& (!maxDate.isValid() || date < maxDate);
}

我们使用自定义dateInRange()函数来确定日期是否有效。

为了能够通过指定给定的时间段来过滤数据,我们还实现了获取和设置最小和最大日期的函数:

void MySortFilterProxyModel::setFilterMinimumDate(QDate date)
{
minDate = date;
invalidateFilter();
}

void MySortFilterProxyModel::setFilterMaximumDate(QDate date)
{
maxDate = date;
invalidateFilter();
}

get函数filterMinimumDate()和filterMaximumDate()很简单,在头文件中作为内联函数实现。

这就完成了我们的自定义代理模型,接下来的文章将介绍如何在应用程序中使用它。

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

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

相关文章

IBL-镜面反射(LUT篇)

1. LUT需要求解什么 首先我们将镜面反射部分的积分分割为两个部分。 L o ( p , ω o ) ∫ Ω L i ( p , ω i ) d ω i ∗ ∫ Ω f r ( p , ω i , ω o ) n ⋅ ω i d ω i L_{o}\left(p, \omega_{o}\right)\int_{\Omega} L_{i}\left(p, \omega_{i}\right) d \omega_{i} * …

基于异常值鲁棒性问题的极限学习机的回归问题研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

外贸软件解决玩具行业管理难点,提升业务效率

在玩具外贸市场&#xff0c;中国显而易见是玩具的生产大国&#xff0c;但却不是玩具生产强国。与发达国家相比&#xff0c;我国玩具行业市场集中度较低&#xff0c;对于国外玩具采购商来说&#xff0c;他们对于采购费用都是相对固定的&#xff0c;连对采购的需求也不会有多少变…

解决在vue中使用elementUI自定义校验及点击提交不生效问题

前言&#xff1a; 本章讲述的主要是对身份证号码的校验 及 为何校验了但提交不生效问题。 拓展小知识&#xff1a; &#x1f340; 1、身份证号码&#xff08;二代18位身份证&#xff09;的含义&#xff1a; 1️⃣ 1-2位&#xff1a;代表所属省级政府的代码&#xff1b; 2️⃣ 3…

【前端】原型和原型链

最近面试的时候&#xff0c;面试官有问到这个&#xff0c;答得很简单&#xff0c;感觉了解得不深&#xff0c;下来之后自己又搜索了一下动手看了看相关的内容。 a. 每个函数都有prototype属性&#xff0c;称之为原型&#xff1b;因为这个属性的值有时候是一个对象&#xff0c;…

2023-04-04 2016天梯赛决赛练习题L2

7-11 互评成绩 学生互评作业的简单规则是这样定的&#xff1a;每个人的作业会被k个同学评审&#xff0c;得到k个成绩。系统需要去掉一个最高分和一个最低分&#xff0c;将剩下的分数取平均&#xff0c;就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。 输…

JUC概述

1. JUC是什么&#xff1f; 在 Java 5.0 提供了 java.util.concurrent(简称JUC)包&#xff0c;在此包中增加了在并发编程中很常用的工具类。此包包括了几个小的、已标准化的可扩展框架&#xff0c;并提供一些功能实用的类&#xff0c;没有这些类&#xff0c;一些功能会很难实现或…

【JavaEE】SpringBoot配置文件的设置及其读取

目录 配置文件作用 配置文件注意事项 properties 用法 修改字符集 优缺点 yml 用法 优缺点 读取配置文件 使用 Value注解 读properties配置文件 读yml配置文件 使用 ConfigurationProperties 注解 读properties配置文件 读yml配置文件 配置文件作用 SpringBoot的…

MCMC采样

MCMC采样 MCMC 是一种随机的近似推断&#xff0c;其核心就是基于采样的随机近似方法蒙特卡洛方法。而近似推断中又可以分成两大类&#xff0c;即为确定性近似 (VI) 和随机近似 (MCMC)。我们需要从概率分布中取 个点&#xff0c;从而近似计算这个积分。常用采样方法有&#xff…

开关柜绝缘状态检测与故障诊断

摘要:电力开关柜作为电力系统的关键设备广泛应用于输电配电网络&#xff0c;其运行可靠性直接影响着电力系统供电质量及安全性能。开关柜绝缘状态检测与故障诊断是及时维修、更换和预防绝缘故障的重要技术手段。在阐述开关柜绝缘状态评估的基础上&#xff0c;指出其内典型的局部…

Docker --- 基本操作、Dockerfile自定义镜像

一、Docker的基本操作 1.1、镜像操作 镜像名称 首先来看下镜像的名称组成&#xff1a; 镜名称一般分两部分组成&#xff1a;[repository]:[tag]。 在没有指定tag时&#xff0c;默认是latest&#xff0c;代表最新版本的镜像 如图&#xff1a; 这里的mysql就是repository&…

数据库课设--基于Python+MySQL的餐厅点餐系统(表的设计)

文章目录 一、系统需求分析二、系统设计1. 功能结构设计2、概念设计2.2.1 bill_food表E-R图2.2.2 bills表E-R图2.2.3 categories E-R图2.2.4 discounts表 E-R图2.2.5 emp表E-R图2.2.6 food 表E-R图2.2.7 member表E-R图2.2.8 member_point_bill表E-R图2.2.9 servers表E-R图2.2.1…

MySQL的事务原理和实现

一、事务属性与架构概述 1、基本概念&#xff1a; 事务&#xff08;Transaction&#xff09;是访问和更新数据库的程序执行单元&#xff1b;事务中可能包含一个或多个sql语句&#xff0c;这些语句要么都执行&#xff0c;要么都不执行。作为一个关系型数据库&#xff0c;MySQL…

为什么很多程序员不反感加班?行内人:老板给钱是真的给啊

为什么很多程序员不反感加班&#xff1f;行内人&#xff1a;说给钱老板真的给&#xff01; 一提到程序员&#xff0c;大部分人第一反应是加班多、996、脱发&#xff0c;这几乎成了外界对程序员刻板印象的标配。不少知名的互联网大厂也是加班之风盛行&#xff0c;譬如著名的华为…

Java版企业电子招投标采购系统源码之登录页面

信息数智化招采系统 服务框架&#xff1a;Spring Cloud、Spring Boot2、Mybatis、OAuth2、Security 前端架构&#xff1a;VUE、Uniapp、Layui、Bootstrap、H5、CSS3 涉及技术&#xff1a;Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、Stre…

Centos8编译安装内核

首先下载kernel&#xff0c;5.x版本的内核&#xff0c;下载地址&#xff1a; https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/ 系统安装相关包&#xff1a; # yum install -y bc gcc make python3 ncurses-devel flex bison openssl-devel elfutils-libelf-devel将内…

南大通用数据库-Gbase-8a-学习-34-gcdump(导出数据库对象定义)

目录 一、测试环境 二、介绍 三、命令帮助 四、参数介绍 1、--print-defaults &#xff08;1&#xff09;含义 &#xff08;2&#xff09;例子 2、--connect_timeout &#xff08;1&#xff09;含义 &#xff08;2&#xff09;例子 3、-A, --all-databases &#xf…

软考初级考什么比较好?信息处理技术员怎么样?

软考初级信息处理技术员难度不大&#xff0c;零基础也是可以直接报考的&#xff0c;熟悉电脑&#xff0c;多练习就差不多了。 本考试设置的科目包括&#xff1a; &#xff08;1&#xff09;信息处理基础知识&#xff0c;考试时间为150分钟&#xff0c;笔试&#xff0c;选择题…

92、Nerfbusters: Removing Ghostly Artifacts from Casually Captured NeRFs

简介 主页:https://ethanweber.me/nerfbusters/ 在远离训练视图的新视图上渲染nerf可能会导致伪影&#xff0c;例如浮动或糟糕的几何形状。这些工件在野外捕获(a)中很普遍&#xff0c;但在NeRF基准测试中很少看到&#xff0c;因为评估视图通常从与训练视图相同的相机路径中选…

HTB_Under Construction—jwt伪造与sqlite注入

根据提示&#xff0c;此题目应该是代码审计类型的&#xff0c;文件结构如下 一般思路有两个&#xff0c;一是看有没有什么敏感信息&#xff0c;二就是看参数传递的地方能否利用&#xff0c;包括注入&#xff0c;伪造等 分析代码 index.js 先来分析入口文件&#xff0c;这是标…