Qt 继承QAbstractTableModel实现自定义TableModel

2023-11-07 22:01

本文主要是介绍Qt 继承QAbstractTableModel实现自定义TableModel,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.简介

QAbstractTableModel为将数据表示为二维项数组的模型提供了一个标准接口。它不直接使用,但必须进行子类化。

由于该模型提供了比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 继承QAbstractTableModel实现自定义TableModel的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366522

相关文章

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局