Qt 模型视图编程之增删行列

news2024/11/23 21:03:58

背景

Qt 模型视图编程中模型定义了标准接口对数据进行访问,可根据需求继承对应的抽象模型类来实现自定义的数据模型。一个基本的数据模型至少要实现以下虚函数:

①.rowCount:行数,返回要显示多少行;

②.columnCount:列数,返回要显示多少列

③.data:读取数据,返回每个单元格要显示的内容

视图不会主动更新数据的显示,模型使用 dataChanged 信号通知视图数据发生变化。

模型增删行列

①.概述

通常在应用程序的数据录入界面中,用户需要能够对当前数据进行插入或者删除;在添加新数据时一般都是先插入空行,再进行数据编辑。

②.关键虚函数

insertRows:数据模型对外提供的插入新行的接口,需要传入要添加的位置及行数;

removeRows:数据模型对外提供的删除指定行的接口,需要传入要删除的位置及行数。

③.重要方法

beginInsertRows:需要在插入新行前调用,会自动触发 rowsAboutToBeInserted 信号;

endInsertRows:需要在插入新行完成后调用,会自动触发 rowsInserted 信号。

beginRemoveRows:需要在删除行之前调用,会自动触发 rowsAboutToBeRemoved 信号;

endRemoveRows:需要在删除行完成之后调用,会自动触发 rowsRemoved 信号。

模型插入新行

①.TableModelDemo.h 文件

#include <QAbstractTableModel>

struct student
{
  QString name;
  int age;
  QString sex;
};//测试用数据结构
Q_DECLARE_METATYPE(student)

class TableModelDemo : public QAbstractTableModel
{
  Q_OBJECT

public:
  TableModelDemo(QList<student> & list, QObject *parent = nullptr):QAbstractTableModel(parent),m_list(list){};
  ~TableModelDemo() {};
public:
  int rowCount(const QModelIndex &parent) const override;//
  int columnCount(const QModelIndex &parent) const override;//
  QVariant data(const QModelIndex &index,int role) const override;//
  Qt::ItemFlags flags(const QModelIndex &index)const override;//
  bool setData(const QModelIndex &index,const QVariant & value, int role = Qt::EditRole)  override;//
  bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;//插入行  
private:
  QList<student> &m_list;//对内存中数据的引用
public:
  void setCustomData(QList<student> & l);
  
};

②.TableModelDemo.cpp 文件

bool TableModelDemo::insertRows(int row, int count, const QModelIndex &parent /*= QModelIndex()*/)
{
  beginInsertRows(parent,row,row+count-1);

  for (int i = row; i < row + count; ++i)
  {
    m_list.insert(i, student());
  }

  endInsertRows();
  return true;
}

③.数据模型初始化

QList<student> m_list;//全局数据

student s;
s.age = 18;
s.name = "张三";
s.sex = "男";
m_list.append(s);

s.age = 16;
s.name = "李四";
s.sex = "女";
m_list.append(s);

auto mode = new TableModelDemo(m_list);

ui.tableView->setModel(mode);

在这里插入图片描述

④.末尾插入行

connect(ui.pushButton, &QPushButton::clicked, [mode]() {

    mode->insertRows(m_list.size(), 2);//末尾插入2行  

});

在这里插入图片描述

模型删除行

①.TableModelDemo.h 文件

class TableModelDemo : public QAbstractTableModel
{
  Q_OBJECT

public:
  TableModelDemo(QList<student> & list, QObject *parent = nullptr):QAbstractTableModel(parent),m_list(list){};
  ~TableModelDemo() {};
public:
  int rowCount(const QModelIndex &parent) const override;//
  int columnCount(const QModelIndex &parent) const override;//
  QVariant data(const QModelIndex &index,int role) const override;//
  Qt::ItemFlags flags(const QModelIndex &index)const override;//
  bool setData(const QModelIndex &index,const QVariant & value, int role = Qt::EditRole)  override;//
  bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;//插入行  
  bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;//删除行
private:
  QList<student> &m_list;//对内存中数据的引用
public:
  void setCustomData(QList<student> & l);
  
};

②.TableModelDemo.cpp 文件

bool TableModelDemo::removeRows(int row, int count, const QModelIndex &parent /*= QModelIndex()*/)
{
  beginRemoveRows(parent, row, row + count - 1);

  for (int i = row + count - 1; i >= row; --i)
  {
    m_list.removeAt(i);
  }

  endRemoveRows();
  return true;
}

③.刪除末尾行

connect(ui.pushButton, &QPushButton::clicked, [mode]() {

    mode->removeRows(m_list.size()-1, 1);//刪除末尾行  

});

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

net基于asp.net的社区团购网站-计算机毕业设计

项目介绍 社区团购系统依托社区团购系统和社区门店,是现在的一个重大市场和发展方向,通过研究企业在社区团购系统环境下的营销模式创新,对于普通的零售业和传统社区团购系统的转型发展具有重要的理论意义。随着互联网行业的发展,人们的生活方式发生着重大变化,人们越来越倾向于…

[附源码]Python计算机毕业设计Django酒店客房管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[附源码]Nodejs计算机毕业设计基于大学生兼职系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

前端基础(七)_表单的基本组成与使用

表单 表单&#xff1a;用于采集不同类型的用户输入数据&#xff0c;发送给服务器&#xff0c;实现用户和服务器之间的数据交互&#xff1b; 表单标签 form 用于声明表单&#xff0c;定义数据的采集范围 注意&#xff1a; 1、一个页面中可以有多个表单标签&#xff0c;但是标…

STM32F4 | 串行通信基本原理 | 串口通信实验

文章目录一、串行通信基本原理1.串行通信接口背景知识2.异步串口通信UART知识3.STM32串口数据格式和通信过程4.STM32串口框图5.波特率计算方法二、STM32F429 串口简介三、硬件设计四、软件设计五、实验现象六、STM32CubeMX 配置串口本章介绍如何使用 STM32F429 的串口来发送和…

手把手教你Spring Cloud Alibaba教程:nacos安装

我们在学习springCloud的时候用的注册中心是Eureka: springBoot集成springCloud&#xff08;一&#xff09;注册中心 但是由于houlai Eureka2.0后续不维护&#xff0c;国内就需要一个可靠的注册中心。但是换了一套后&#xff0c;有哪些不同呢 SpringCloud和SpringCloudAliba…

fl21怎么换主题flstudio皮肤怎么换?

FLstudio21如何更改皮肤主题&#xff1f;不光是背景&#xff0c;还有按键什么的&#xff1f; 请参考下面的步骤进行设置fl视图设置。 第1步&#xff0c;打开visualstudiofl视图设置。 第2步fl视图设置&#xff0c;打开“工具”--“选项” 第3步&#xff0c;在“环境”--“常…

基于SpringBoot+MySql的分页功能实现

分页功能是为了缓解数据库的压力而实现的功能,实际上是将数据库中的数据分段查询出来,避免一次性将所有的数据全部查出来,查出来的部分数据通过前端的页面中不同的页数来展现出来 实现基础 mysql数据库中的查询语句中提供的limit关键字 该关键字可以限制查询的记录数,例如 s…

【026】基于vue+springboot的教务信息管理系统(含源码、数据库、课设报告、运行教程)

文章目录一、项目介绍二、源码获取一、项目介绍 基于Vue&#xff0b;springbootmysql的教务信息管理系统&#xff0c;UI设计主要采用element-ui&#xff0c;也使用了echarts做学生成绩的可视化界面&#xff0c;使用了xlsx表导入、导出数据&#xff0c;超级吊的教务管理系统&…

[操作系统笔记]页面置换算法

内容系听课复习所做笔记&#xff0c;图例多来自课程截图 常见的页面置换算法有&#xff1a;最优算法、随机算法、FIFO、LRU 随机算法顾名思义 FIFO(先进先出, First In First Out)算法&#xff1a;可能产生抖动现象和Belady现象 LRU&#xff08;最近最少使用算法&#xff09…

基于FFmpeg的视频播放器开发系列教程(二)

对于ffmpeg的架构介绍&#xff0c;请参考24岁“封神”雷霄骅的博客&#xff0c;他已离开江湖&#xff0c;但江湖仍有他的传说。 FFmpeg源代码结构图 - 编码&#xff1a;https://blog.csdn.net/leixiaohua1020/article/details/44226355 FFmpeg源代码结构图 - 解码&#xff1a;h…

【剪辑教程】如何给视频添加配音旁白,三种文字转语音方法教给你

视频剪辑完成&#xff0c;应该如何给视频配音&#xff1f;三种配音方法快来学 现在许多自媒体都居家创作短视频&#xff0c;那么给短视频配音的问题就摆着了面前&#xff0c;怎么给我们的短视频配音呢&#xff0c;接下来就教大家三种给视频添加配音的方法。 方法一&#xff1a…

Linux权限(1)

Linux权限(1) &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;Linux &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录Linux权限(1)1. Linux权限的概念1.1 Linux上的用…

NLP之文本分类模型调优(模型基于tensorflow1.14)

项目链接&#xff1a;https://pan.baidu.com/s/1yOu0DogWkL8WOJksJmeiPw?pwd4bsg 提取码: 4bsg 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v4的分享 1.基于上一篇文章中的文本分类项目进行精度调优&#xff0c;提升模型准确率&…

CET-4 week10 语法

0基础入门 point 谓语中自带 助动词 Such as ,I do like computer (强调且默认带有这个属性 大多数情况隐藏状态) 所有时态都有被动 do ->donewill do -> will be donehave down ->have been downbe doing ->be being donedid -> been downhad down ->ha…

flink-cdc-connectors-release-2.3.0自己编译

最新的cdc是2.21仅支持flink 1.13* 1.14*&#xff0c;而flink已经有1.15版本&#xff1b;自己编译支持1.15 下载官方包 https://github.com/ververica/flink-cdc-connectors/releases/tag/release-2.3.0 我下载的是source包&#xff0c;大家也可以去下载源码 1、下载后我们只需…

JUC并发编程第十三篇,AQS的作用与体系结构

JUC并发编程第十三篇&#xff0c;AQS的作用与体系结构一、AQS是什么&#xff1f;二、AQS在JUC中的地位与作用三、AQS体系结构一、AQS是什么&#xff1f; AbstractQueuedSynchronizer&#xff08;抽象队列同步器&#xff09;&#xff0c;是用来构建锁或者其它同步器组件的重量级…

[附源码]Node.js计算机毕业设计高校社团管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

java EE初阶 — 多线程案例单例模式

文章目录1单例模式主要模式1.1 饿汉模式1.2 懒汉模式2 单例模式安全性问题1单例模式主要模式 在某些场景中&#xff0c;有些特定的类只能输出一个实例&#xff08;对象&#xff09;&#xff0c;不应该创建多个实例&#xff0c;此时就可以使用 单例模式。 使用了单例模式后&…

5款轻量级小软件,第一款更是近期必备!

今天的主题是简洁&#xff0c;轻便&#xff0c;都是轻量级的小软件&#xff0c;界面都是非常简洁&#xff0c;而且无广告的。 1.自动抢火车票工具——12306Bypass 12306Bypass是一款专用于帮助用户抢购火车车票的工具&#xff0c;春运马上就到了&#xff0c;又到了抢票回家的…