Qt 继承QAbstractTableModel实现自定义TableModel

1.简介

QAbstractTableModel是Qt框架中的一个抽象类,用于实现数据模型,用于在Qt的视图组件中展示和编辑表格数据。它提供了一些基本的接口和默认实现,可以方便地创建自定义的表格数据模型。

QAbstractTableModel的主要功能包括以下几点:

  • 数据的获取和设置:通过实现data()和setData()接口,可以用于获取和设置表格中的数据。可以根据自己的数据结构和逻辑,在这两个接口中进行相关的操作。data()方法用于获取指定单元格的数据,setData()方法用于设置指定单元格的数据。
  • 行和列的管理:可以通过rowCount()和columnCount()方法获取表格中的行数和列数。也可以通过insertRows()、removeRows()、insertColumns()和removeColumns()等方法动态地增加或删除行和列。
  • 表格的显示和编辑:可以通过实现displayRole和editRole相关方法来确定表格数据在视图中的显示和编辑方式。也可以通过实现flags()方法来指定每个单元格的编辑属性。
  • 数据的排序:可以通过实现sort()方法来对表格中的数据进行排序。

由于该模型提供了比QAbstractItemModel更专业的接口,因此它不适合与树视图一起使用,尽管它可以用于向QListView提供数据。如果需要表示一个简单的项列表,并且只需要一个模型包含一列数据,那么将QAbstractListModel子类化可能更合适。

继承QAbstractTableModel,需要重写rowCount()、columnCount()、data()和headerData()等函数。

  • rowCount()函数返回模型的行数。
  • columnCount()函数返回模型的列数。
  • data()函数返回指定索引处的数据。
  • headerData()函数返回表头的数据,根据orientation参数返回水平或垂直表头的数据。

2.示例

做一个自定义的表格。

声明数据结构体:

typedef struct _student
{
    QString name;
    int age;
    double score;
}Student;

重写rowCount()、columnCount()、data()和headerData()等函数。

void update(QList<Student> students);这个是我自定义的方法,用来设置数据。

#ifndef MYTABLEMODEL_H
#define MYTABLEMODEL_H

#include <QAbstractTableModel>
#include <QObject>
#include <QList>

typedef struct _student
{
    QString name;
    int age;
    double score;
}Student;

class MyTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    MyTableModel(QObject *parent = nullptr);


    enum RoleNames{
        Name,
        Age,
        Score
    };

public:
    //更新
    void update(QList<Student> students);

    //行数量
    virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;

    //列数量
    virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;

    // 表格项数据
    virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;

    // 表头数据
    virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;

private:
    QList<Student> m_lstStu;
};

#endif // MYMODEL_H


#include "MyTableModel.h"

MyTableModel::MyTableModel(QObject *parent)
    : QAbstractTableModel(parent)
{

}

void MyTableModel::update(QList<Student> students)
{
    m_lstStu = students;
    for(int i=0;i<m_lstStu.size();i++)
    {
        beginInsertRows(QModelIndex(),i,i);
        endInsertRows();
    }
}

int MyTableModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);

    return m_lstStu.count();
}

int MyTableModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);

    return 3;
}

QVariant MyTableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    int nColumn = index.column();
    int nRow = index.row();
    Student stu = m_lstStu.at(nRow);

    if(role == Qt::DisplayRole)
    {
        if (nColumn == MyTableModel::Name)
            return stu.name;
        else if(nColumn == MyTableModel::Age)
            return stu.age;
        else if(nColumn == MyTableModel::Score)
            return stu.score;
    }


    return QVariant();
}

QVariant MyTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    Q_UNUSED(section);

    if(orientation == Qt::Horizontal && role == Qt::DisplayRole)
    {
        if (section == MyTableModel::Name)
            return QStringLiteral("姓名");
        else if(section == MyTableModel::Age)
            return QStringLiteral("年龄");
        else if(section == MyTableModel::Score)
            return QStringLiteral("分数");

    }

    return QVariant();
}

使用示例:

    //去除选中虚线框
    ui->tableView->setFocusPolicy(Qt::NoFocus);

    //设置最后一栏自适应长度
    ui->tableView->horizontalHeader()->setStretchLastSection(true);

    //设置整行选中
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);

    //不显示垂直表头
    ui->tableView->verticalHeader()->setVisible(false);

    MyTableModel *pModel = new MyTableModel(this);

    // 构造数据,更新界面
    QList<Student> students;
    QList<QString> nameList;
    nameList<<"张三"<<"李四"<<"王二"<<"赵五"<<"刘六";

    for (int i = 0; i < 5; ++i)
    {
        Student student;
        student.name = nameList.at(i);
        student.age = qrand()%6 + 13;//随机生成13到19的随机数
        student.score = qrand()%20 + 80;//随机生成0到100的随机数;

        students.append(student);
    }

    pModel->update(students);
    ui->tableView->setModel(pModel);

3.推荐

Qt 继承QAbstractListModel实现自定义ListModel-CSDN博客

Qt 插件开发详解_qt插件化开发-CSDN博客

Qt QWidget、QDialog、QMainWindow的区别-CSDN博客

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

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

相关文章

吃啥大转盘

经常跟朋友出去吃饭&#xff0c;选择太困难了所以写了个简单的转盘&#xff0c;直接copy到txt文本然后把文件后缀改成html即可。 需要换食物直接在文件中找到 list 值按照格式替换一下即可。 效果&#xff1a; 代码块&#xff1a; <html><head><meta http-…

制作一个用户登录界面

Flask-WTF扩展使用Python类来表示web表单。表单类只是将表单的字段定义为类变量。 再次考虑到分离的问题&#xff0c;我将使用一个新的app/forms.py模块来存储我的web表单类。首先&#xff0c;让我们定义一个用户登录表单&#xff0c;它要求用户输入用户名和密码。表单还将包括…

Window 11中安装Rust编译环境和集成开发环境

https://blog.csdn.net/weixin_43882409/article/details/87616268是我参考的一篇文章。 下载 先到https://www.rust-lang.org/learn/get-started&#xff0c;下载64-Bit&#xff08;64位&#xff09;的rustup-init.exe文件。 使用其他方式进行安装的网址https://forge.rust…

Unity Mirror学习(二) Command属性使用

Command&#xff08;命令&#xff09;属性 1&#xff0c;修饰方法的&#xff0c;当在客户端调用此方法&#xff0c;它将在服务端运行&#xff08;我的理解&#xff1a;客户端命令服务端做某事&#xff1b;或者说&#xff1a;客户端向服务端发消息&#xff0c;消息方法&#xff…

(StateFlow ShareFlow) VS (Flow LiveData)

目录 数据流程 大致流程 切换线程 StateFlow & ShareFlow StateFlow 构建StateFlow &ShareFlow 在之前的Flow&#xff0c;collect函数浅析和仿Flow构建器创建数据流文章中我们探索了flow的简单使用及它的简单原理&#xff0c;但是生产过程中我们往往会借用这些基…

小程序订单中心path设置本次审核不通过,审核原因:小程序尚未发布,无法审核。

小程序尚未发布&#xff0c;无法审核。 先按照这篇文章把小程序审核通过&#xff0c;小程序版本审核未通过&#xff0c;需在开发者后台「版本管理—提交审核——小程序订单中心path」设置订单中心页path&#xff0c;请设置后再提交代码审核 小程序审核通过后&#xff0c;发布…

高效自学-网络安全(黑客技术)

一、网络安全应该怎么学&#xff1f; 1.计算机基础需要过关 这一步跟网安关系暂时不大&#xff0c;是进入it行业每个人都必须掌握的基础能力。 计算机网络计算机操作系统算法与数据架构数据库 Tips:不用非要钻研至非常精通&#xff0c;可以与学习其他课程同步进行。 2.渗透技…

Vue计算属性 computed

计算属性&#xff1a;常用于逻辑比较复杂的计算&#xff0c;根据已有的数据&#xff0c;计算出一个新的数据。计算属性具有缓存机制&#xff0c;复用性强&#xff0c;效率更高。 计算属性【简写方式】&#xff1a; <template><div>提现金额&#xff1a;<input …

【漏洞复现】XXL-JOB默认accessToken身份绕过远程命令执行漏洞

漏洞描述 xxl-job是一个中心式分布式的调度平台,调度中心和执行器解耦,执行器和业务代码耦合,代码的侵入性少,学习简单、开发简单、轻量级 XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线…

树莓派4B的测试记录(CPU、FFMPEG)

本文是用来记录树莓派 4B 的一些测试记录。 温度 下面记录中的风扇和大风扇是这样的&#xff1a; 为什么要用大风扇呢&#xff1f;因为小风扇在外壳上&#xff0c;气流通过外壳的珊格会有啸叫&#xff0c;声音不大但是很烦人&#xff0c;大风扇没这个问题&#xff0c;并且同样…

【计算机网络基础实验】实验二(补充内容)路由器的配置和静态路由

任务一 IP路由协议实现企业路由器通信 目录如下&#xff1a; 任务一 IP路由协议实现企业路由器通信一、实验目的&#xff1a;二、实验环境三、实验内容四、实验步骤1、路由器的基本配置&#xff08;1&#xff09;实验拓扑图&#xff08;2&#xff09;启动路由器&#xff08;3&a…

k8s-Pod控制器

一、Pod控制器 1.Pod控制器及其功用 Pod控制器&#xff0c;又称之为工作负载&#xff08;workload&#xff09;&#xff0c;是用于实现管理pod的中间层&#xff0c;确保pod资源符合预期的状态&#xff0c;pod的资源出现故障时&#xff0c;会尝试进行重启&#xff0c;当根据重启…

猫头虎博主第7期赠书活动:《计算机考研精炼1000题》

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

设计模式(3)-结构型模式

结构型模式 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式&#xff0c;前者采用继承机制来组织接口和类&#xff0c;后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低&#xff0c;满足“合成复用原则…

数据结构 - 全貌总结

目录 一. 前言 二. 分类 三. 常见的线性和非线性结构 一. 前言 数据结构是计算机存储、组织数据的方式。一种好的数据结构可以带来更高的运行或者存储效率。数据在内存中是呈线性排列的&#xff0c;但是我们可以使用指针等道具&#xff0c;构造出类似“树形”等复杂结构。 数…

ubuntu 安装 zsh、ohmyzsh并配置必要插件

下述记录是完成全部操作后回忆记录得来&#xff0c;或有不准确。我只记录安装中确实用到的指令&#xff0c;参考资料中有扩展内容&#xff0c;记录如下&#xff1a; ubuntu使用zsh终端并安装nerd font字体——nerd font字体不太好安装&#xff0c;使用fonts-powerline替代。 Ub…

Masked Image Training for Generalizable Deep Image Denoising 论文阅读笔记

CVPR2023 港科大&#xff08;广州&#xff09;发的一篇denoising的论文&#xff0c;作者里面有上海AILab的董超老师&#xff08;看introduction的时候看到有一段很像董超老师 Networks are slaching off 的论文的思想&#xff0c;说网络overfitting的时候学习了训练集的噪声模式…

NR DCI size alignment

DCI对齐在38.212 7.3.1.0 DCI size alignment 中讲述。 Step 0 CSS 下&#xff0c;DCI 0_0根据初始UL BWP 确定大小&#xff0c;DCI 1_0 根据CORESET0 或初始DL BWP&#xff08;没有CORESET 0时&#xff09; 确定大小 根据激活的UL/DL BWP 确定DCI 0_0和DCI 1_0 的size&…

DehazeNet: An End-to-End System for Single Image Haze Removal(端到端的去雾模型)

1、论文去雾总体思路 DehazeNet是2016年华南理工大学的研究者提出的一个端到端的深度学习模型&#xff0c;该模型主要通过输入的原始有雾图像拟合出该图所对应的medium transmission map&#xff08;透射率t值图&#xff09;&#xff0c;并使用引导滤波对t值进行refine&#x…

TSINGSEE青犀智能分析网关工服识别算法,如何最大限度保障工人安全?

众所周知&#xff0c;TSINGSEE青犀智能分析网关算法繁多&#xff0c;大多数算法已经和大家讲解过了&#xff0c;今天就和大家聊一聊工服识别算法。工服识别算法一般应用于工地、化工、煤矿等场所&#xff0c;用来监督检测施工人员是否按照要求着工服&#xff0c;最大程度保障人…