当前位置: 首页 > news >正文

qt QAbstractTableModel详解

1、概述

QAbstractTableModel 是 Qt 框架中的一个类,用于在 Qt 应用程序中实现自定义的表格数据模型。它是 Qt 中的一个抽象基类,提供了创建和操作表格数据所需的接口。QAbstractTableModel 为模型提供了一个标准接口,这些模型将其数据表示为二维项目数组,适用于向 QTableView 或 QML 中的 TableView 组件提供数据,用于显示和编辑。

2、重要方法

QAbstractTableModel 中有几个重要的方法需要子类实现或重写,这些方法定义了表格的数据源和结构:

  • rowCount():返回表格的行数。
  • columnCount():返回表格的列数。
  • data(int row, int column, int role = Qt::DisplayRole):返回指定单元格的数据。row 和 column 分别表示行和列的索引,role 表示数据的角色(如显示文本、字体、对齐方式等)。
  • headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole):返回表头的数据。section 表示列或行的索引,orientation 表示方向(水平或垂直),role 表示数据的角色。
  • flags(const QModelIndex &index) const:返回指定单元格的标志,用于控制单元格是否可编辑、可选择等。

此外,如果模型支持数据的插入和删除,还需要实现以下方法:

  • insertRows(int row, int count, const QModelIndex &parent = QModelIndex())
  • removeRows(int row, int count, const QModelIndex &parent = QModelIndex())
  • insertColumns(int column, int count, const QModelIndex &parent = QModelIndex())
  • removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

在实现这些方法时,需要调用 beginInsertRows()、endInsertRows()、beginRemoveRows()、endRemoveRows()、beginInsertColumns()、endInsertColumns()、beginRemoveColumns() 和 endRemoveColumns() 等函数,以便通知所有连接的视图关于模型的更改。

3、重要信号

QAbstractTableModel 还发出一些重要的信号,用于通知视图关于模型的更改:

  • dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = QVector<int>() const):当模型中某个范围的数据发生更改时发出此信号。
  • headerDataChanged(Qt::Orientation orientation, int first, int last):当模型的表头数据发生更改时发出此信号。
  • layoutChanged():当模型的底层数据结构发生变化,导致整个布局需要重新绘制时发出此信号。

4、重要角色和标志

以下是QAbstractTableModel 类中一些常见的角色和标志及其简要介绍:

角色(Role)
  • Qt::DisplayRole:用于显示的数据。
  • Qt::EditRole:用于编辑的数据。
  • Qt::ToolTipRole:用于显示工具提示的数据。
  • Qt::DecorationRole:用于显示装饰图标的数据。
  • Qt::CheckstateRole:用于显示复选框状态的数据。
标志(Flags)
  • Qt::ItemIsSelectable:项是可选中的。
  • Qt::ItemIsEditable:项是可编辑的。
  • Qt::ItemIsEnabled:项是启用的。
  • Qt::ItemIsUserCheckable:项是用户可复选的。
#include <QApplication>
#include <QMainWindow>
#include <QTableView>
#include <QVariant>
#include <QVector>class TableModel : public QAbstractTableModel
{Q_OBJECTpublic:TableModel(QObject *parent = nullptr) : QAbstractTableModel(parent){// 初始化数据dataList = {{"Alice", "30", "Engineer"},{"Bob", "25", "Designer"},{"Charlie", "35", "Manager"}};}// 获取行数int rowCount(const QModelIndex &parent = QModelIndex()) const override{if (parent.isValid()) return 0;return dataList.size();}// 获取列数int columnCount(const QModelIndex &parent = QModelIndex()) const override{if (parent.isValid()) return 0;return dataList.isEmpty() ? 0 : dataList[0].size();}// 获取数据项的值QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override{if (!index.isValid() || role != Qt::DisplayRole)return QVariant();return dataList[index.row()][index.column()];}// 标题QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override{if (role != Qt::DisplayRole)return QVariant();if (orientation == Qt::Horizontal) {switch (section) {case 0: return "Name";case 1: return "Age";case 2: return "Occupation";}}return QVariant();}// 设置数据项的值bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override{if (index.isValid() && role == Qt::EditRole) {dataList[index.row()][index.column()] = value.toString();emit dataChanged(index, index, {role});return true;}return false;}// 获取数据项的标志属性Qt::ItemFlags flags(const QModelIndex &index) const override{if (!index.isValid())return Qt::NoItemFlags;return Qt::ItemIsSelectable | Qt::ItemIsEditable | Qt::ItemIsEnabled;}// 插入新行bool insertRows(int position, int rows, const QModelIndex &parent = QModelIndex()) override{beginInsertRows(QModelIndex(), position, position + rows - 1);for (int row = 0; row < rows; ++row) {dataList.insert(position, {"", "", ""});}endInsertRows();return true;}// 移除行bool removeRows(int position, int rows, const QModelIndex &parent = QModelIndex()) override{beginRemoveRows(QModelIndex(), position, position + rows - 1);for (int row = 0; row < rows; ++row) {dataList.removeAt(position);}endRemoveRows();return true;}private:QVector<QVector<QString>> dataList;
};int main(int argc, char *argv[])
{QApplication app(argc, argv);// 创建主窗口QMainWindow mainWindow;mainWindow.setWindowTitle("QAbstractTableModel Example");mainWindow.resize(400, 300);// 创建自定义表模型TableModel *model = new TableModel;// 创建表视图QTableView *tableView = new QTableView;tableView->setModel(model);tableView->horizontalHeader()->setStretchLastSection(true);tableView->setEditTriggers(QAbstractItemView::DoubleClicked);// 布局管理QVBoxLayout *layout = new QVBoxLayout;layout->addWidget(tableView);QWidget *centralWidget = new QWidget;centralWidget->setLayout(layout);mainWindow.setCentralWidget(centralWidget);// 显示主窗口mainWindow.show();return app.exec();
}

  • 觉得有帮助的话,打赏一下呗。。
  •            

相关文章:

qt QAbstractTableModel详解

1、概述 QAbstractTableModel 是 Qt 框架中的一个类&#xff0c;用于在 Qt 应用程序中实现自定义的表格数据模型。它是 Qt 中的一个抽象基类&#xff0c;提供了创建和操作表格数据所需的接口。QAbstractTableModel 为模型提供了一个标准接口&#xff0c;这些模型将其数据表示为…...

掌握 Navicat 数据库结构设计 | 提升工作效率的秘诀

近期&#xff0c;我们介绍了 Navicat 17 的一系列的新特性&#xff0c;包括&#xff1a;兼容更多数据库、全新的模型设计、可视化 BI、智能数据分析、可视化查询解释、高质量数据字典、增强用户体验、扩展 MongoDB 功能、轻松固定查询结果、便捷 URI、支持更多平台等。今天&…...

Ollama AI 框架缺陷可能导致 DoS、模型盗窃和中毒

近日&#xff0c;东方联盟网络安全研究人员披露了 Ollama 人工智能 (AI) 框架中的六个安全漏洞&#xff0c;恶意行为者可能会利用这些漏洞执行各种操作&#xff0c;包括拒绝服务、模型中毒和模型盗窃。 知名网络安全专家、东方联盟创始人郭盛华表示&#xff1a;“总的来说&…...

vue 3:监听器

目录 1. 基本概念 2. 侦听数据源类型 1. 监听getter函数 2. 监听 ref 或 reactive 的引用 3. 多个来源组成的数组 4. 避免直接传递值&#xff01;&#xff01;&#xff01; 3. 深层侦听器 4. 立即回调的侦听器 5. 一次性侦听器 6. watchEffect() 7. 暂停、恢复和停止…...

Java学习路线:Maven(四)Maven常用命令

在IDEA的Maven模块中&#xff0c;可以看到每个项目都有一个生命周期 这些生命周期实际上是Maven的一些插件&#xff0c;每个插件都有各自的功能&#xff0c;而双击这些插件就可以执行命令 这些命令的功能如下&#xff1a; clean&#xff1a;清除整个 target文件夹&#xff0c…...

服务器数据恢复—分区结构被破坏的reiserfs文件系统数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器中有一组由4块SAS硬盘组建的RAID5阵列&#xff0c;上层安装linux操作系统统。分区结构&#xff1a;boot分区LVM卷swap分区&#xff08;按照顺序&#xff09;&#xff0c;LVM卷中划分了一个reiserfs文件系统作为根分区。 服务器故障…...

lua入门教程:type函数

在Lua中&#xff0c;type 函数是一个内置函数&#xff0c;用于返回给定值的类型。Lua 支持多种数据类型&#xff0c;包括 nil&#xff08;空值&#xff09;、boolean&#xff08;布尔值&#xff09;、number&#xff08;数字&#xff09;、string&#xff08;字符串&#xff09…...

Java图片转word

该方法可以控制一页是否只显示存放一张图片 第一步 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache…...

立体视觉的核心技术:视差计算与图像校正详解

立体视觉的核心技术&#xff1a;视差计算与图像校正详解 在立体视觉中&#xff0c;通过双目相机&#xff08;即左右两台相机&#xff09;的不同视角捕获的图像&#xff0c;结合几何关系&#xff0c;我们可以推算出场景中物体的深度。本文将深入讲解如何基于视差&#xff08;di…...

PaddleNLP的FAQ问答机器人

项目源码获取方式见文章末尾&#xff01; 600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【DDRNet模型创新实现人像分割】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实…...

2024年12月中国多场国际学术会议,EI检索录用!

2024年12月&#xff0c;多场国际学术会议将在中国多地召开&#xff0c;涵盖AI、机器人、大数据、网络安全、传感制造、环境工程、物联网等领域&#xff0c;促进学术交流&#xff0c;录用论文将EI检索&#xff0c;诚邀国内外专家参会。 第三届人工智能、人机交互和机器人国际学…...

日语学习的难易程度

日语学习的难易程度是一个相对主观的问题&#xff0c;它受到多种因素的影响&#xff0c;包括个人的语言学习能力、学习方法、学习时间、学习资源的可获得性以及个人对日语文化的兴趣和投入程度等。以下是对日语学习难易程度的一些分析&#xff1a; 优点与易学之处 文字系统&am…...

java-web-web后端知识小结

spring框架三大核心: IOC--控制反转 DI---依赖注入 AOP--面向切面编程 web开发技术小结 1.过滤器,JWT令牌 2.三层架构 IOC, DI AOP, 全局异常处理, 事务管理 mybatis 3.数据操作与存储 mysql 阿里云OSS(云存储) 各个技术的归属: 1.过滤器, cookie,session--javaWeb 2.JWT, 阿里…...

常见的排序算法(二)

归并排序 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治法&#xff08;Divide and Conquer&#xff09;的排序算法。它将一个大的问题分解成小的问题&#xff0c;然后递归地解决这些小问题&#xff0c;最后合并&#xff08;merge&#xff09;得到最终的排序结果。…...

spark的RDD分区的设定规则

目录 一、第一种&#xff1a;parallelize 获取rdd时 二、第二种&#xff1a;通过外部读取数据-textFile 三、上面提到了默认分区数&#xff0c;那么默认分区是怎么计算呢&#xff1f; 一、第一种&#xff1a;parallelize 获取rdd时 没有指定&#xff1a;spark.default.paral…...

【点云网络】voxelnet 和 pointpillar

VoxelNet 和 pointpillar 这两个网络可以认为后者是前者的升级版本&#xff0c;都是采用了空间划分的方法&#xff0c; 一个是体素&#xff0c;一个是pillar, 前者是3D卷积处理中间特征&#xff0c;后者是2D卷积处理中间特征。 voxelnet voxelnet 应该是比较早的onestage的网…...

HAL库硬件IIC驱动气压传感器BMP180

环境 1、keilMDK 5.38 2、STM32CUBEMX 初始配置 默认即可。 程序 1、头文件 #ifndef __BMP_180_H #define __BMP_180_H#include "main.h"typedef struct {float fTemp; /*温度&#xff0c;摄氏度*/float fPressure; /*压力&#xff0c;pa*/float fAltitude; /*…...

探索Python音频处理的奥秘:Pydub库的魔法

文章目录 探索Python音频处理的奥秘&#xff1a;Pydub库的魔法第一部分&#xff1a;背景介绍第二部分&#xff1a;Pydub是什么&#xff1f;第三部分&#xff1a;如何安装Pydub&#xff1f;第四部分&#xff1a;Pydub的简单函数使用方法1. 打开音频文件2. 播放音频3. 导出音频文…...

LeetCode 热题100(七)【链表】(2)

目录 7.6合并两个有序链表&#xff08;简单&#xff09; 7.7两数相加&#xff08;中等&#xff09; 7.8删除链表的倒数第N个节点&#xff08;中等&#xff09; 7.9两两交换链表中的节点&#xff08;中等&#xff09; 7.10k个一组翻转链表&#xff08;困难&#xff09; 7.6…...

计算机网络 TCP/IP体系 网络层

一. 网络层的基本概念 网络层主要负责将数据从源端主机发送到目的端主机。在这一过程中&#xff0c;网络层要解决的关键问题是数据包的路由选择&#xff0c;即确定数据包通过互联网的最佳路径。 1.1 网络层的信息类型 数据包&#xff1a;这是网络层传输的主要形式&#xff0c…...

Vue2项目里用Cesium加载天地图标注,保姆级避坑指南(含Token申请)

Vue2项目集成Cesium与天地图标注的工程化实践指南 当WebGIS需求遇上Vue技术栈&#xff0c;如何在老项目中优雅地引入三维地图能力&#xff1f;本文将以工程化视角&#xff0c;系统讲解Vue2项目中集成Cesium加载天地图标注的完整技术路径。不同于基础教程&#xff0c;我们将重点…...

家庭知识库中心:OpenClaw+Qwen3.5-9B管理个人数字资产

家庭知识库中心&#xff1a;OpenClawQwen3.5-9B管理个人数字资产 1. 为什么需要家庭知识库 去年搬家时&#xff0c;我在整理纸质文件的过程中发现一个严重问题&#xff1a;孩子的疫苗接种记录、房产合同、医疗报告等重要文档分散在多个文件夹中&#xff0c;紧急情况下根本找不…...

Comsol页岩气水平井压裂模型

Comsol页岩气水平井压裂模型页岩气开采这事儿&#xff0c;说简单也简单说难也难。水平井压裂技术就像在岩石里画树枝——主井眼横向延伸&#xff0c;裂缝网络像毛细血管般扩散。玩过COMSOL的老铁肯定知道&#xff0c;这软件搞多物理场耦合就像拼乐高&#xff0c;但真要把地质力…...

OpenClaw怎么部署?2026年1分钟部署OpenClaw、配置百炼APIKey、集成Skill保姆级图文教程

OpenClaw怎么部署&#xff1f;2026年1分钟部署OpenClaw、配置百炼APIKey、集成Skill保姆级图文教程。OpenClaw&#xff08;原Clawdbot&#xff09;作为2026年主流的AI自动化助理平台&#xff0c;可通过阿里云轻量服务器实现724小时稳定运行&#xff0c;并快速接入钉钉&#xff…...

CDA Level-2 考试全攻略:从报名到备考的保姆级教程(含最新题库资源)

CDA Level-2 考试全攻略&#xff1a;从报名到备考的保姆级教程 最近两年数据分析师认证热度持续攀升&#xff0c;CDA认证作为国内认可度较高的专业证书之一&#xff0c;Level-2考试通过率常年维持在40%左右。不同于Level-1的基础考核&#xff0c;Level-2更注重实际分析能力与统…...

Ostrakon-VL-8B环境配置:Ubuntu 22.04 + CUDA 12.1 + PyTorch 2.3 验证清单

Ostrakon-VL-8B环境配置&#xff1a;Ubuntu 22.04 CUDA 12.1 PyTorch 2.3 验证清单 想快速在Ubuntu系统上跑通Ostrakon-VL-8B这个强大的视觉理解模型&#xff0c;但被各种环境依赖搞得头大&#xff1f;别担心&#xff0c;这份清单就是为你准备的。 Ostrakon-VL-8B是一个专门…...

从参数化几何到气动分析:OpenVSP航空设计工具深度解析

从参数化几何到气动分析&#xff1a;OpenVSP航空设计工具深度解析 【免费下载链接】OpenVSP A parametric aircraft geometry tool 项目地址: https://gitcode.com/gh_mirrors/ope/OpenVSP 在航空工程领域&#xff0c;如何将概念设计快速转化为可分析的几何模型一直是技…...

Vue表单生成器深度解析:3个维度重塑你的表单开发体验

Vue表单生成器深度解析&#xff1a;3个维度重塑你的表单开发体验 【免费下载链接】vue-form-generator :clipboard: A schema-based form generator component for Vue.js 项目地址: https://gitcode.com/gh_mirrors/vu/vue-form-generator 在当今快速迭代的前端开发中&…...

Eigen库实战指南——从基础到精通

1. Eigen库基础入门&#xff1a;矩阵与向量操作 第一次接触Eigen库是在做机器人运动学仿真时&#xff0c;当时被它简洁的API设计惊艳到了。这个纯头文件的C模板库&#xff0c;不需要编译安装&#xff0c;只需包含头文件就能使用&#xff0c;对开发者极其友好。Eigen最核心的Mat…...

RVC变声器全场景解决方案:6大核心问题的系统解决策略

RVC变声器全场景解决方案&#xff1a;6大核心问题的系统解决策略 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conversi…...