Qt 继承QAbstractListModel实现自定义ListModel
1.简介
QAbstractListModel是Qt框架中的一个抽象类,用于实现数据模型,用于在Qt的视图组件中展示和编辑列表数据。与QAbstractTableModel类似,它也是一个抽象类,提供了一些基本的接口和默认实现,可以方便地创建自定义的列表数据模型。
QAbstractListModel的主要功能包括以下几点:
- 数据的获取和设置:通过实现data()和setData()接口,可以用于获取和设置列表中的数据。可以根据自己的数据结构和逻辑,在这两个接口中进行相关的操作。data()方法用于获取指定索引位置的数据,setData()方法用于设置指定索引位置的数据。
- 列表项的管理:可以通过rowCount()方法获取列表中的项数。也可以通过insertRows()和removeRows()方法动态地增加或删除列表项。
- 列表的显示和编辑:可以通过实现displayRole和editRole相关方法来确定列表数据在视图中的显示和编辑方式。也可以通过实现flags()方法来指定每个列表项的编辑属性。
- 数据的排序:可以通过实现sort()方法来对列表中的数据进行排序。
由于该模型提供了比QAbstractItemModel更专业的接口,因此不适合与树视图一起使用;如果您想提供一个用于此目的的模型,则需要对QAbstractItemModel进行子类化。如果您需要使用多个列表模型来管理数据,则可能更适合使用子类QAbstractTableModel。
继承QAbstractListModel,需要重写rowCount()、data()、insertRows()、removeRows()等函数。
- rowCount()函数返回模型的行数。
- data()函数返回指定索引处的数据。
- insertRows()插入行
- removeRows()删除行
2.示例
声明数据结构体:
typedef struct _student
{QString name;int age;double score;
}Student;
重写rowCount()、data()、insertRows()和removeRows()等函数。
#ifndef MYLISTMODEL_H
#define MYLISTMODEL_H#include <QAbstractListModel>
#include <QObject>
#include <QList>typedef struct _student
{QString name;int age;double score;
}Student;class MyListModel : public QAbstractListModel
{Q_OBJECT
public:MyListModel(QObject *parent = nullptr);enum RoleNames{Name,Age,Score};public://更新void update(QList<Student> students);// 返回列表中行的数量virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;// 返回指定索引处的数据virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;//插入行virtual bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex());//删除行virtual bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex());private:QList<Student> m_lstStu;
};#endif // MYLISTMODEL_H#include "MyListModel.h"MyListModel::MyListModel(QObject *parent): QAbstractListModel(parent)
{}void MyListModel::update(QList<Student> students)
{m_lstStu = students;for(int i=0;i<m_lstStu.size();i++){beginInsertRows(QModelIndex(),i,i);endInsertRows();}
}int MyListModel::rowCount(const QModelIndex &parent) const
{Q_UNUSED(parent);return m_lstStu.size();
}QVariant MyListModel::data(const QModelIndex &index, int role) const
{if(!index.isValid())return QVariant();int nRow = index.row();Student stu = m_lstStu.at(nRow);if (role == Qt::DisplayRole || role == Qt::EditRole){QString ret = QString("%1_%2_%3").arg(stu.name).arg(stu.age).arg(stu.score);return ret;}return QVariant();
}bool MyListModel::insertRows(int row, int count, const QModelIndex &parent)
{if (row >= 0 && row <= m_lstStu.size()){beginInsertRows(parent, row, row + count - 1);for (int i = 0; i < count; ++i){//插入一个空的数据Student stu;stu.name = QString();stu.age = 0;stu.score = 0;m_lstStu.insert(row, stu);}endInsertRows();return true;}return false;
}bool MyListModel::removeRows(int row, int count, const QModelIndex &parent)
{if (row >= 0 && row + count <= m_lstStu.size()){beginRemoveRows(parent, row, row + count - 1);for (int i = 0; i < count; ++i){m_lstStu.removeAt(row);}endRemoveRows();return true;}return false;
}
使用示例:
#include "ListForm.h"
#include "ui_ListForm.h"
#include "MyListModel.h"MyListModel *pModel = nullptr;ListForm::ListForm(QWidget *parent) :QWidget(parent),ui(new Ui::ListForm)
{ui->setupUi(this);//去除选中虚线框ui->listView->setFocusPolicy(Qt::NoFocus);//设置整行选中ui->listView->setSelectionBehavior(QAbstractItemView::SelectRows);pModel = new MyListModel(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->listView->setModel(pModel);
}ListForm::~ListForm()
{delete ui;
}void ListForm::on_btnInsert_clicked()
{if(!pModel)return;int row = ui->listView->currentIndex().row();if(row < 0)return;pModel->insertRows(row+1,1);
}void ListForm::on_btnDel_clicked()
{if(!pModel)return;int row = ui->listView->currentIndex().row();if(row < 0)return;pModel->removeRows(row,1);
}
3.推荐
Qt 继承QAbstractTableModel实现自定义TableModel-CSDN博客
Qt 插件开发详解_qt插件化开发-CSDN博客
Qt 继承QAbstractTableModel实现自定义TableModel-CSDN博客
相关文章:

Qt 继承QAbstractListModel实现自定义ListModel
1.简介 QAbstractListModel是Qt框架中的一个抽象类,用于实现数据模型,用于在Qt的视图组件中展示和编辑列表数据。与QAbstractTableModel类似,它也是一个抽象类,提供了一些基本的接口和默认实现,可以方便地创建自定义的…...
TensorFlow2.0教程2-全连接神经网络以及深度学习技巧
文章目录 基础MLP网络1.回归任务2.分类任务mlp及深度学习常见技巧1.基础模型2.权重初始化3.激活函数4.优化器5.批正则化6.dropout基础MLP网络 1.回归任务 import tensorflow as tf import tensorflow.keras as keras import tensorflow.keras.layers as layers# 导入数据 (x_t…...
【OpenCV】Mat矩阵解析 Mat类赋值,单/双/三通道 Mat赋值
文章目录 1 Mat (int rows, int cols, int type)2 Mat 的其他矩阵3 Mat 的常用属性方法4 成员变量5 Mat赋值5.1 Mat(int rows, int cols, int type, const Scalar& s)5.2 数组赋值 或直接赋值5.2.1 3*3 单通道 img5.2.2 3*3 双通道 img5.2.3 3*3 三通道 imgOpenCV Mat类详解…...

微服务之Nacos注册管理
文章目录 一、Nacos安装步骤1.安装地址2.安装版本3.目录说明4.端口配置5.启动 二、Nacos服务注册1.Nacos依赖2.客户端修改配置文件3.启动效果图4.总结 三、Nacos服务集群属性1.服务跨集群调用问题2.服务集群属性3.总结 四、Nacos根据集群负载均衡1.修改配置文件2.设置集群服务类…...

Spring boot集成sentinel限流服务
Sentinel集成文档 Sentinel控制台 Sentinel本身不支持持久化,项目通过下载源码改造后,将规则配置持久化进nacos中,sentinel重启后,配置不会丢失。 架构图: 改造步骤: 接着我们就要改造Sentinel的源码。…...

软件测试|测试方法论—边界值
边界值分析法是一种很实用的黑盒测试用例方法,它具有很强的发现故障的能力。边界值分析法也是作为对等价类划分法的补充,测试用例来自等价类的边界。 这个方法其实是在测试实践当中发现,Bug 往往出现在定义域或值域的边界上,而不…...
OceanBase 笔记
目录 1. OceanBase 笔记1.1. 命令行 1. OceanBase 笔记 1.1. 命令行 # -usysoraclet#obcluster # -u用户名租户名#集群名...

ubuntu, nvidia driver, cuda, cudnn, pytorch-gpu版本安装
文章目录 1.常用指令1.1查看cpu是intel还是amd:1.2.查看ubuntu版本1.3.查看架构1.4.查看已安装的nvidia驱动1.5.进入tty模式 2.安装ubuntu22.04 和 nvidia 驱动3.ubuntu 安装 anaconda4.安装pytorch gpu版本5.安装完整版cuda 和 cudnn6.nvidia-driver, cuda-toolkit, cudnn 1.常…...

探索环保葡萄酒之生物动力
根据生物动力农业和园艺协会的说法,生物动力农业是“一种精神-伦理-生态的农业、园艺、食品生产和营养方法。”生物动力农民将他们的农场或葡萄园视为一个坚固的有机体,一个自我维持的生态系统。这些农业哲学和实践在整个农业周期中应用了一种整体方法。…...

【线上问题】服务器关机导致docker启动的mysql数据库消失了
目录 一、问题描述二、解决方式 一、问题描述 1. 服务器迁移断电导致docker启动的mysql数据库没有了数据 2. data目录是空的 3. mysql重启数据库消失了 二、解决方式 1. sudo -i切换root账号 2. 查找mysql的容器卷 find /var/lib/docker/volumes/ -name mysql3. 进入各个_dat…...

Win10 180天后怎么才能继续体验,自动保持续期,无需手动JH
环境: Win10 专业版 自制小程序 问题描述: Win10 180天后怎么才能继续体验,自动保持续期,无需手动JH 解决方案: 在执行本程序前需要以管理员身份运行!关闭杀毒软件,否则会失败,本方案只能在个人电脑测试体验, 只能用于学习测试体验 ,勿用与商业行为 1.先完全JH…...

RHCE8 资料整理(五)
RHCE8 资料整理 第五篇 系统管理第18章 进程管理18.1 进程介绍18.2 查看进程18.3 向进程发送信号18.4 进程优先级 第19章 日志19.1 rsyslog的配置19.2 查看日志 第20章 网络时间服务器20.1 时间同步必要性20.2 配置时间服务器20.3 配置客户端 第21章 计划任务21.1 at21.2 cront…...
CPU 飙高系统反应慢怎么排查
mic老师面试题摘选 面试过程中,场景类的问题更容易检测出一个开发人员的基本能力。 这不,一个小伙伴去阿里面试,第一面就遇到了关于“CPU 飙高系统反应慢怎么排查” 的问题? 对于这个问题,我们来看看普通人和高手…...

深度学习之基于YoloV5-Deepsort人物识别与追踪系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 YoloV5-Deepsort是一种基于深度学习的人物识别与追踪系统,具有较高的准确率和实时性能。 YoloV5是一种…...

Spring Boot中配置多个数据源
配置数据源实际上就是配置多个数据库,在一个配置文件中配置多个数据库,这样做主要的好处有以下几点: 数据库隔离:通过配置多个数据源,可以将不同的业务数据存储在不同的数据库中,实现数据的隔离。这样可以…...
C++学习笔记---命名空间namespace
文章目录 前言简介定义命名空间using指令不连续&嵌套的命名空间 前言 wu 简介 C中的命名空间(Namespace)是一种用于组织和封装代码的机制,它允许你将一组相关的函数、类、变量和其他标识符放置在一个逻辑分组内,以便在不同的…...

缓存-Spring Cache 缓存抽象
缓存-Spring Cache 缓存抽象 Spring从版本3.1开始提供非侵入的将Cache集成到Spring应用的方式。Spring Cache提供Cache的统一抽象,支持集成各种不同的缓存解决方案。从4.1版本开始,提供了注解和更多的定制参数。 Spring Cache 抽象提供了对Java方法的缓存…...

Java修仙传之神奇的ES2(巧妙的查询及结果处理篇)
SDL语句查询 查询的基本语法 GET /indexName/_search {"query": {"查询类型": {"查询条件": "条件值"}} } 根据文档id查询 #查询文档 GET hotel/_doc/36934 查询所有 会弹出该索引库下所有文档// 查询所有 GET /indexName/_searc…...
架构设计的课程资料
架构设计课 枫叶云笔记...

数据结构与算法C语言版学习笔记(5)-串,匹配算法、KMP算法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、串的定义二、串的存储结构1.顺序结构2.链式结构 三、串的朴素的模式匹配算法(暴力匹配算法)1.背景2.假设我们要从下面的主串 S"…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...

02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...

算法—栈系列
一:删除字符串中的所有相邻重复项 class Solution { public:string removeDuplicates(string s) {stack<char> st;for(int i 0; i < s.size(); i){char target s[i];if(!st.empty() && target st.top())st.pop();elsest.push(s[i]);}string ret…...