用自定义的QSortFilterProxyModel实现条件过滤,使qtableview中只显示满足条件的行信息

news2024/11/7 13:57:46
在实际开发中,qtableview是qt客户端页面中最常用的控件之一。运用qtableview的同时,也会存在着先对初始数据进行过滤,然后在qtableview上展示的只有满足条件的那些信息。或者在不同的条件下要展示出不同的满足条件的行信息。
第一种方法,就是我们在将数据设置在qtableview的model之前,将满足条件的信息筛选出来,然后直接填入model.
第二种方法,就是先不对数据进行处理,直接将数据塞入qtableview的model,然后再给qtableview设置一个筛选代理proxymodel(QSortFilterProxyModel)对model中数据进行刷选,然后展示出来的就是能满足条件的model.
1、先看项目目录结构

在这里插入图片描述

2、添加数据model文件, studentmodel.h,studentmodel.cpp
studentmodel.h



#include <QAbstractItemModel>
class Student
{
public:
    QString name;  //姓名
    int age;       //年龄
    int height;    //身高
    int weight;    //体重
};
Q_DECLARE_METATYPE(Student);

class StudentModel : public QAbstractItemModel
{
    Q_OBJECT
public:
    enum {
        column_name = 0,
        column_age,
        column_height,
        column_weight
    };
    explicit StudentModel(QObject *parent = nullptr);

    void setInfo(QList<Student>& studentList);

    void clear();

    QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;

    QModelIndex parent(const QModelIndex &index) const override;

    int rowCount(const QModelIndex &parent = QModelIndex()) const override;

    int columnCount(const QModelIndex &parent = QModelIndex()) const override;

    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;

    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;

private:
    QList<Student> m_studentList;

};
studentmodel.cpp


#include "studentmodel.h"

StudentModel::StudentModel(QObject *parent)
    : QAbstractItemModel{parent}
{

}

void StudentModel::setInfo(QList<Student>& studentList)
{
    m_studentList = studentList;
    beginInsertRows(QModelIndex(), 0, m_studentList.size() -1);
    endInsertRows();
}

void StudentModel::clear()
{
    m_studentList.clear();
    beginResetModel();
    endResetModel();
}

QModelIndex StudentModel::index(int row, int column, const QModelIndex &parent) const
{
    return createIndex(row, column, nullptr);
}

QModelIndex StudentModel::parent(const QModelIndex &index) const
{
    return QModelIndex();
}

int StudentModel::rowCount(const QModelIndex &parent) const
{
    return m_studentList.size();
}

int StudentModel::columnCount(const QModelIndex &parent) const
{
    return 4;
}

QVariant StudentModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (orientation == Qt::Vertical)
    {
        return QVariant();
    }
    if (role == Qt::DisplayRole)
    {
        switch (section)
        {
        case column_name:
            return tr("name");
            break;
        case column_age:
            return tr("age");
            break;
        case column_height:
            return tr("height");
            break;
        case column_weight:
            return tr("weight");
            break;
        }
    }
    return QVariant();
}

QVariant StudentModel::data(const QModelIndex &index, int role) const
{
    int row = index.row();
    int col = index.column();
    auto info = m_studentList.at(row);
    if (role == Qt::DisplayRole)
    {
        switch (col)
        {
        case column_name:
            return info.name;
            break;
        case column_age:
            return QString::number(info.age);
            break;
        case column_height:
            return QString::number(info.height);
            break;
        case column_weight:
            return QString::number(info.weight);
            break;
        }
    }
    else if (role == Qt::UserRole)
    {
        return QVariant::fromValue<Student>(m_studentList[row]);
    }
    return QVariant();
}
3、添加筛选过滤model文件, studentproxymodel.h,studentproxymodel.cpp
studentproxymodel.h


#include <QSortFilterProxyModel>
#include "studentmodel.h"

class StudentProxyModel : public QSortFilterProxyModel
{
    Q_OBJECT
public:
    explicit StudentProxyModel(QObject *parent = nullptr);

protected:
    // 返回true表示source的资源包含在代理model中
    virtual bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const;

};

#include "studentproxymodel.h"

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

}

bool StudentProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
{
    QModelIndex source = sourceModel()->index(source_row, 0, source_parent);
    // 资源Enttiy节点进行过滤
    Student student = source.data(Qt::UserRole).value<Student>();
    //过滤条件:如果年龄小于20,或身高小于170,或体重小于50,则不显示,返回false
    if(student.age < 20)
    {
        return false;
    }
    if(student.height < 170)
    {
        return false;
    }
    if(student.weight < 50)
    {
        return false;
    }
    return true;
}

4、在widget.cpp中添加测试代码
widget.cpp


#include "widget.h"
#include "ui_widget.h"
#include <QTableView>
#include <QBoxLayout>
#include "studentmodel.h"
#include "studentproxymodel.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    QHBoxLayout* layout = new QHBoxLayout(this);
    this->setLayout(layout);
    QTableView* tableView = new QTableView(this);
    layout->addWidget(tableView);

    Student stu1;
    stu1.age = 18;
    stu1.name = "sandy";
    stu1.height = 170;
    stu1.weight = 50;

    Student stu2;
    stu1.age = 23;
    stu1.name = "alice";
    stu1.height = 168;
    stu1.weight = 55;

    Student stu3;
    stu1.age = 20;
    stu1.name = "make";
    stu1.height = 178;
    stu1.weight = 60;

    Student stu4;
    stu1.age = 22;
    stu1.name = "jason";
    stu1.height = 180;
    stu1.weight = 70;

    QList<Student> studentList;
    studentList.clear();
    studentList.append(stu1);
    studentList.append(stu2);
    studentList.append(stu3);
    studentList.append(stu4);

    StudentModel* model = new StudentModel(this);
    StudentProxyModel* proxyModel = new StudentProxyModel(this);
    proxyModel->setSourceModel(model);
    tableView->setModel(proxyModel);
    model->setInfo(studentList);
}

Widget::~Widget()
{
    delete ui;
}
5、结果显示满足过滤条件(只有make和jason满足过滤条件)

在这里插入图片描述

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

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

相关文章

电脑删除的视频怎么恢复?可尝试着3钟恢复办法!

无论是为了工作还是生活&#xff0c;我们都有可能在电脑上保存重要的视频&#xff0c;如宣传视频、回忆录视频等。这些视频通常包含了制作者的心血&#xff0c;要是被我们误删除了&#xff0c;很难重新拍摄&#xff0c;那么电脑删除的视频怎么恢复&#xff1f; 能。通常&#…

用 GPU 加速 PQC 方案:Montgomery、SHA3

参考文献&#xff1a; [DK91] Duss S R, Kaliski B S. A cryptographic library for the Motorola DSP56000[C]//Advances in Cryptology—EUROCRYPT’90: Workshop on the Theory and Application of Cryptographic Techniques Aarhus, Denmark, May 21–24, 1990 Proceeding…

Tensorboard安装及简单使用

Tensorboard 1. tensorboard 简单介绍2. 安装必备环境3. Tensorboard安装4. 可视化命令 1. tensorboard 简单介绍 TensorBoard是一个可视化的模块&#xff0c;该模块功能强大&#xff0c;可用于深度学习网络模型训练查看模型结构和训练效果&#xff08;预测结果、网络模型结构…

带头的循环双向链表的简单介绍

目录 带头的循环双向链表&#xff1a; 1、带头&#xff1a; 2、循环&#xff1a; 3、双向&#xff1a; 图例&#xff1a; 带头的双向循环链表的创建&#xff1a; 头文件部分&#xff1a; 主函数部分&#xff1a; 最终调试效果&#xff1a; 使用一级指针传参的原因&am…

异常数据检测 | Python奇异谱分析(SSA)数据缺失值插补

文章目录 文章概述模型描述源码分享参考资料文章概述 长时序栅格数据经常会出现一些缺失值,会对后续的分析造成很大的不便。这便需要利用一些插值算法对这些缺失数据进行填补,奇异谱分析(SSA)便是常用的一种插值方法。 模型描述 在时间序列分析中,「奇异谱分析」(「SS…

了解活动聊天机器人如何革新活动行业

在如今快节奏的时代&#xff0c;活动策划和管理对于任何活动的成功变得至关重要。无论是会议、展览会还是企业聚会&#xff0c;组织者都努力为参与者创造难忘的体验&#xff0c;同时确保幕后的顺利执行。然而&#xff0c;由于有许多任务需要处理且资源有限&#xff0c;管理活动…

智慧油气田方案:视频+AI识别,助力油气田生产与管理智能化转型

一、背景与挑战 根据《“十四五”能源领域科技创新规划》指出&#xff0c;要推动核心技术创新突破&#xff0c;推动煤炭、油田、电厂、电网等传统行业与数字化、智能化技术深度融合。我国油田产业已经摆脱了早期粗放式增长的阶段&#xff0c;需要更加精细化、智慧化、科学化的…

59个外贸开发信爆款标题,提高你的邮件打开率

标题是吸引读者打开邮件的第一印象&#xff0c;对于外贸销售人员来说&#xff0c;精心撰写开发信标题至关重要。客户收到的邮件那么多&#xff0c;那么在客户收件箱中的5至20个客户邮件标题中&#xff0c;你必须确保自己的标题能够脱颖而出。 下面的外贸开发信标题示例&#x…

第十四章 Iambda表达式和流处理

第十四章 Iambda表达式和流处理 14.1&#xff1a;Iambda表达式简介 Iambda表达式可以用非常少的代码来实现抽象方法。 Iambda表达式不能独立执行&#xff0c;因此必须是西安函数式接口&#xff0c;并返回一个函数式接口的对象。 Iambda表达式的语法特殊的 语法格式如下 &…

我在明白软件测试这个道理后,涨薪10万

上升期的创业型公司 vs 大厂 如何抉择&#xff1f; 最近总有一些学生特别“凡尔赛”的发几个 offer 问我选择哪个&#xff1f;其中比较典型的一个问题就是&#xff1a; “一个是处于上升期的创业型公司 &#xff0c;一个行业大厂&#xff0c;薪资待遇差不多&#xff0c;到底该…

良心推荐,超好用老师小程序

各位老师&#xff0c;今天咱就来说说一件让你们省心省力的事儿——成绩查询系统。那些年&#xff0c;咱们或许都经历过手动发布成绩的痛苦&#xff0c;但现在&#xff0c;时代变了&#xff01;咱们有了小程序可以使用了&#xff0c;学生们可以自助查询成绩&#xff0c;省去了您…

Springboot+vue的班级综合测评管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的班级综合测评管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的班级综合测评管理系统&#xff0c;采用M&#xff08…

【微信小程序开发】自定义组件以及页面布局设计 )

【微信小程序开发】自定义组件以及页面布局设计 1.创建自定义组件2...在tabs的wxml文件中定制组件模板2.1.js中定义组件的属性2.2.定义组件的相关事件2.3在其他页面引用组件2.4在使用组件的wxml页面中使用组件2.5定义属性值 三。个人中心的实现 ) 1.创建自定义组件 要新建comp…

加密货币恐怖融资惊动国会!而链上分析公司看不下去了,紧急辟谣?

巴以冲突发生后&#xff0c;关于以加密货币资助恐怖分子的争论不断。全球最大的交易所币安和稳定币发行商Tether都表示己配合冻结多个账户和地址&#xff0c;以切断哈玛斯加密金援。美国合规交易所Coinbase也在近日发表了防止加密货币非法活动的宣言&#xff0c;反加密出名的参…

Mysql第二篇---InnoDB数据存储结构

Mysql第二篇—InnoDB数据存储结构 数据库的存储结构: 页 索引结构给我们提供了高效的索引方式, 不过索引信息以及数据记录都是保存在文件上的(innodb的ibd文件, MyISAM的MyI和MyD文件), 确切的说是存储在页结构中. 另一方面, 索引是在存储引擎中实现的, MySQL服务器上的存储引…

M-BUS和modbus的区别是什么?

M-BUS与Modbus是两种在工业自动化和楼宇自动化领域广泛应用的通信协议。那么&#xff0c;这两种通信协议有哪些区别呢?下面&#xff0c;就由小编带大家一起来了解下吧! 一、简介 M-BUS(Multi-dropBus&#xff0c;多点通信总线)和Modbus(莫迪波特率)都是用于设备和系统之间通信…

Python清理数据的常用方法总结

目录 1、数据预览 2、缺失值处理 3、异常值处理 4、数据类型转换 5、重复值处理 6、数据标准化 7、特征选择 8、处理类别数据 总结 在数据科学和机器学习领域&#xff0c;数据清理是一个非常重要的步骤。未经清理的数据可能会包含许多问题&#xff0c;例如缺失值、异常…

C++中多态的使用和建立条件

一、多态引入 多态按字面的意思就是多种形态。当类之间存在层次结构&#xff0c;并且类之间是通过继承关联时&#xff0c;就会用到多态。 C 多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函数。 根据代码&#xff0c;引入多态的概念&#xff1…

智能台灯语音控制丨解放双手

台灯是日常生活中一种常见的照明产品。以往的台灯大多都是采取手动控制&#xff0c;通过按键去对台灯的亮度进行调整。随着科技的发展&#xff0c;台灯也开始走向了智能化。人们已经能够对智能台灯进行语音控制&#xff0c;通过调节灯光开关、色温、灯光亮度等操作&#xff0c;…

代码随想录Day24 LeetCode T491 递增子序列 LeetCode T46 全排列 LrrtCode T47 全排列II

LeetCode T491 递增子序列 题目链接:491. 递增子序列 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 首先这里的测试用例很容易误导我们,这道题不能使用上次子集的思路对数组先排序,使用一个used数组来解决问题. 我们用[4,7,6,7]举例这道题的递增序列不存在[4,6,7,7]这个…