Qt QAbstractItemModel类详解

news2024/11/15 11:41:57

文章目录

  • 一.概述
  • 二.QAbstractItemModel类
    • 1.类型
    • 2.信号
    • 3.函数

一.概述

QAbstractItemModel 类定义了项目模型必须使用的标准接口,以便能够与模型/视图Model/View框架中的其他组件进行互操作。 正确用法是将其子类化以创建新模型。此类用作 QML 中的项目视图元素或 Qt Widgets 模块中的项目视图类的底层数据模型。如果需要一个模型与项目视图一起使用,例如 QML 的列表视图元素或 C++控件QListView 或 QTableView,则应该考虑子类化QAbstractListModel 或 QAbstractTableModel 而不是此类。底层数据模型作为表的层次结构向视图和委托公开。 如果不使用层次结构,那么模型就是一个简单的行和列表。每个项目都有一个由 QModelIndex 指定的唯一索引。
在这里插入图片描述
可以通过模型访问的每个数据项都有一个关联的模型索引。可以使用index()函数获取此模型索引。每个索引可以有一个sibling()索引;子项具有parent()索引。

二.QAbstractItemModel类

1.类型

类型原型说明
enum classCheckIndexOption { NoOption, IndexIsValid, DoNotUseParent, ParentIsInvalid }此枚举可用于控制由 checkIndex() (此函数检查 index 是否是该模型的合法模型索引)执行的检查。
flagsCheckIndexOptions
enumLayoutChangeHint { NoLayoutChangeHint, VerticalSortHint, HorizontalSortHint }此枚举描述模型更改布局的方式

2.信号

返回值信号说明
voidcolumnsAboutToBeInserted(const QModelIndex &parent, int first, int last)该信号在列插入模型之前发出。新项目将位于给定parent下的first和last之间。
voidcolumnsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)该信号在列在模型内移动之前发出。将被移动的项目是在给定的 sourceParent 项目下的 sourceStart 和 sourceEnd 之间的项目。 它们将被移动到destinationParent,从destinationColumn 列开始。
voidcolumnsAboutToBeRemoved(const QModelIndex &parent, int first, int last)该信号在列从模型中移除之前发出。要删除的项目是在给定 parent 下的 first 和 last 之间的项目。
voidcolumnsInserted(const QModelIndex &parent, int first, int last)在将列插入模型之后发出此信号。新项目是在给定parent下的first和last之间的项目。
voidcolumnsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column)在模型内移动列之后发出此信号。给parent下的 start 和 end 之间的项目已移至 column 列开始的destination。
voidcolumnsRemoved(const QModelIndex &parent, int first, int last)从模型中删除列后会发出此信号。 删除的项目是在给parent下的first和last之间的项目。
voiddataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList &roles = QList())只要现有项目中的数据发生变化,就会发出此信号。
voidheaderDataChanged(Qt::Orientation orientation, int first, int last)每当更改标题时都会发出此信号。
voidlayoutAboutToBeChanged(const QList &parents = QList(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)该信号在模型布局更改之前发出。
voidlayoutChanged(const QList &parents = QList(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)每当模型公开的项目布局发生变化时,就会发出此信号(例如,当模型已经排序)。
voidmodelAboutToBeReset()在调用 beginResetModel() 时,在模型的内部状态(例如,持久模型索引)失效之前,会发出此信号。
voidmodelReset()在模型的内部状态(例如,持久模型索引)失效后,调用 endResetModel() 时会发出此信号。
voidrowsAboutToBeInserted(const QModelIndex &parent, int start, int end)该信号在行插入模型之前发出。新项目在给定的parent下将被定位在start和end之间。
voidrowsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)该信号在行在模型内移动之前发出。将被移动的项目是在给定的 sourceParent 项目下的 sourceStart 和 sourceEnd 之间的项目。 它们将被移动到destinationParent 行,从destinationRow 开始。
voidrowsAboutToBeRemoved(const QModelIndex &parent, int first, int last)该信号在行从模型中移除之前发出。 将被删除的项目是在给定parent下的first和last之间的项目。
voidrowsInserted(const QModelIndex &parent, int first, int last)在将行插入模型后发出此信号。新项目是在给定parent下的first和last之间的项目。
voidrowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row)在模型内移动行后发出此信号。 给定parent下的 start 和 end 之间的项已移动到从row行开始的destination。
voidrowsRemoved(const QModelIndex &parent, int first, int last)从模型中删除行后会发出此信号。删除的项目是在给定parent下的first和last之间的项目。

3.函数

返回值函数说明
QAbstractItemModel(QObject *parent = nullptr)
virtual~QAbstractItemModel()
virtual QModelIndexbuddy(const QModelIndex &index) const返回由index表示的项目的好友模型索引。
virtual boolcanDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent) const如果模型可以接受拖拽数据,则返回 true。
virtual boolcanFetchMore(const QModelIndex &parent) const如果父级有更多可用数据,则返回 true。默认实现始终返回 false。
boolcheckIndex(const QModelIndex &index, QAbstractItemModel::CheckIndexOptions options = CheckIndexOption::NoOption) const此函数检查 index 是否是该模型的合法模型索引。
virtual boolclearItemData(const QModelIndex &index)删除存储在给定索引的所有角色中的数据。成功则返回true。如果成功删除数据,则应发出 dataChanged() 信号。
virtual intcolumnCount(const QModelIndex &parent = QModelIndex()) const = 0返回给定父级的子级的列数。
virtual QVariantdata(const QModelIndex &index, int role = Qt::DisplayRole) const = 0返回存储在给定角色下的数据,用于索引引用的项目。
virtual booldropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)处理拖放拖入的数据。
virtual voidfetchMore(const QModelIndex &parent)获取具有由父索引指定的父项的项的任何可用数据。如果以增量方式填充模型,需要重新实现它。
virtual Qt::ItemFlagsflags(const QModelIndex &index) const返回给定索引的项目标志。
virtual boolhasChildren(const QModelIndex &parent = QModelIndex()) constparent 是否有子项。
boolhasIndex(int row, int column, const QModelIndex &parent = QModelIndex()) const如果模型为具有父级的行和列返回有效的 QModelIndex,则返回 true。
virtual QVariantheaderData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const返回具有指定方向的标题中给定角色和部分的数据。对于水平标题,节号对应于列号。 同样,对于垂直标题,节号对应于行号。
virtual QModelIndexindex(int row, int column, const QModelIndex &parent = QModelIndex()) const = 0返回由给定的行、列和父索引指定的模型中项目的索引。
boolinsertColumn(int column, const QModelIndex &parent = QModelIndex())在指定的父项的子项中的给定列之前插入单列。如果成功插入了列则返回 true。
virtual boolinsertColumns(int column, int count, const QModelIndex &parent = QModelIndex())上面函数的重载函数
boolinsertRow(int row, const QModelIndex &parent = QModelIndex())在指定的父项的子项中的给定行之前插入单行。如果成功插入了列则返回 true。
virtual boolinsertRows(int row, int count, const QModelIndex &parent = QModelIndex())上面函数的重载函数
virtual QMap<int, QVariant>itemData(const QModelIndex &index) const返回一个map,其中包含index处的项目的模型中所有预定义角色的值。
virtual QModelIndexListmatch(const QModelIndex &start, int role, const QVariant &value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchStartsWithQt::MatchWrap)) const
virtual QMimeData *mimeData(const QModelIndexList &indexes) const返回一个对象,其中包含与指定索引列表相对应的序列化数据项。用于描述编码数据的格式是从 mimeTypes() 函数获得的。
virtual QStringListmimeTypes() const返回允许的 MIME 类型列表。
boolmoveColumn(const QModelIndex &sourceParent, int sourceColumn, const QModelIndex &destinationParent, int destinationChild)在支持此功能的模型上,将 sourceColumn 从 sourceParent 移动到 destinationParent 下的 destinationChild。
virtual boolmoveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild)在支持此功能的模型上,将从父 sourceParent 下的给定 sourceColumn 开始的列移动到父 destinationParent 下的列 destinationChild。
boolmoveRow(const QModelIndex &sourceParent, int sourceRow, const QModelIndex &destinationParent, int destinationChild)在支持此功能的模型上,将从父 sourceParent 下的给定 sourceColumn 开始的行移动到父 destinationParent 下的行 destinationChild。
virtual boolmoveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild)在支持此功能的模型上,将从父 sourceParent 下的给定 sourceColumn 开始的行移动到父 destinationParent 下的行 destinationChild。
virtual voidmultiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan) const使用给定索引的请求数据填充 roleDataSpan。
virtual QModelIndexparent(const QModelIndex &index) const = 0返回具有给定索引的模型项的父项。
boolremoveColumn(int column, const QModelIndex &parent = QModelIndex())从指定的父项的子项中删除给定列。如果列被删除返回 true。
virtual boolremoveColumns(int column, int count, const QModelIndex &parent = QModelIndex())在支持此功能的模型上,从模型中删除 parent 下的给定 column 开头的 count列。如果列被成功删除则返回 true。
boolremoveRow(int row, const QModelIndex &parent = QModelIndex())从指定的父项的子项中删除给定行。如果行被删除返回 true。
virtual boolremoveRows(int row, int count, const QModelIndex &parent = QModelIndex())在支持此功能的模型上,从模型中删除 parent 下的给定 row 开头的 count列。如果行被成功删除则返回 true。
virtual QHash<int, QByteArray>roleNames() const返回模型的角色名称。
virtual introwCount(const QModelIndex &parent = QModelIndex()) const = 0返回给定父项下的行数。
virtual boolsetData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)设置索引处项目的角色数据。成功则返回true。如果成功设置了数据,则应发出 dataChanged() 信号。
virtual boolsetHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)设置标题的值。如果标题的数据已更新则返回 true。
virtual boolsetItemData(const QModelIndex &index, const QMap<int, QVariant> &roles)对于每个 Qt::ItemDataRole,将 index 处项目的角色数据设置为角色中的关联值。不在角色中的角色将不会被修改。
virtual QModelIndexsibling(int row, int column, const QModelIndex &index) const返回索引处项目的行和列的兄弟,如果该位置没有兄弟,则返回无效的 QModelIndex。
virtual voidsort(int column, Qt::SortOrder order = Qt::AscendingOrder)按给定顺序按列对模型进行排序。
virtual QSizespan(const QModelIndex &index) const返回由索引表示的项目的行和列跨度。
virtual Qt::DropActionssupportedDragActions() const返回此模型中数据支持的操作。
virtual Qt::DropActionssupportedDropActions() const返回此模型支持的放置操作。
返回值函数说明
voidbeginInsertColumns(const QModelIndex &parent, int first, int last)开始列插入操作。
voidbeginInsertRows(const QModelIndex &parent, int first, int last)开始行插入操作。
boolbeginMoveColumns(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild)开始列移动操作。
boolbeginMoveRows(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild)开始行移动操作。
voidbeginRemoveColumns(const QModelIndex &parent, int first, int last)开始列移除操作。
voidbeginRemoveRows(const QModelIndex &parent, int first, int last)开始行移除操作。
voidbeginResetModel()开始模型重置操作。
voidchangePersistentIndex(const QModelIndex &from, const QModelIndex &to)
voidchangePersistentIndexList(const QModelIndexList &from, const QModelIndexList &to)
QModelIndexcreateIndex(int row, int column, const void *ptr = nullptr) const使用内部指针 ptr 为给定的行和列创建模型索引。
QModelIndexcreateIndex(int row, int column, quintptr id) const上面函数的重载函数
voidendInsertColumns()结束列插入操作。
voidendInsertRows()结束行插入操作。
voidendMoveColumns()结束列移动操作。
voidendMoveRows()结束行移动操作。
voidendRemoveColumns()结束列移除操作。
voidendRemoveRows()结束行删除操作。
voidendResetModel()完成模型重置操作。
QModelIndexListpersistentIndexList() const返回在模型中存储为持久索引的索引列表。

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

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

相关文章

自制Alfred/Wox插件推荐

最近上手Alfred的使用&#xff0c;日常工作中存在很多需要高频执行的连续性动作&#xff0c;将这一系列动作封装成Workflow&#xff0c;通过命令触发&#xff0c;对提升效率确有很大帮助。 自己封装了一些简单的Workflow&#xff0c;这里分享出来。有Alfred/Wox框架的支撑&…

JAVA零基础小白学习免费教程day14-SetHashMap

day14_JAVAOOP 课程目标 1. 【理解】Set集合的特点 2. 【理解】Set集合不重复的原理 3. 【掌握】HaseSet集合的基本使用 4. 【理解】LinkedHashSet的特点 5. 【理解】Map集合的特点 6. 【掌握】HashMap的使用 7. 【理解】LinkedHashMap的特点 8. 【掌握】Map集合的案例 9. 【…

doxygen教程之注释风格

作者&#xff1a;朱金灿 来源&#xff1a;clever101的专栏 为什么大多数人学不会人工智能编程&#xff1f;>>> doxygen是一个开源的C接口文档生成工具。要使用doxygen生成接口文档&#xff0c;就必须遵循它的注释规范&#xff0c;下面对它的注释规范进行简单介绍。 …

C语言基础--初识指针

文章目录一、初识指针二、指针和指针类型指针类型的意义1&#xff09;指针的解引用①问题抛出②探讨③总结2&#xff09;指针整数3&#xff09;总结4)举例三、野指针&#xff08;1&#xff09;概念1) 指针未初始化2)指针越界访问3&#xff09;指针指向的空间释放&#xff08;2&…

python类中常见内置方法

目录 一.几种常用的类内置方法 魔术方法 _ _str_ _字符串方法 _ _lt_ _小于符号比较方法 _ _le_ _小于等于比较符号方法 _ _eq_ _等于比较符号 一.几种常用的类内置方法 魔术方法 上文提到的_ _init_ _构造方法&#xff0c;是Python类内置的方法之一。 这些内置的类方法…

人工智能-聚类算法

1、聚类算法简介 典型的无监督算法&#xff0c;主要用于将相似的样本自动归到一个类别中。 根据样本之间的相似性&#xff0c;将样本划分到不同的类别中&#xff0c;对于不同的相似度计算方法&#xff0c;会得到不同的聚类结果。常用的相似度计算方法是欧式距离法 聚类算法与…

2022年总结 2023展望

前言 今天是2022年最后一天&#xff0c;姑且简单总结这一年。这一年从头到尾发生了很多翻天覆地的事件。回看去年2021年的年度总结还是有些遗憾&#xff0c;完成度4/7。 回顾 2021 年立下的 flag&#xff1a; 写文章30篇 没有完成&#xff0c;技术和知识是在有断断续续学习&a…

【Linux】多线程

目录 一、什么是线程 1、线程的基本认识 2、Linux线程与接口关系的认识 3、创建线程 4、线程等待 5、线程终止 6、线程分离 二、线程的优点 三、线程的缺点 四、线程与进程的关系 1、线程安全与重入 2、不可重入情况 3、可重入情况 4、可重入与线程安全的联系 五…

算法合集 —— 数组篇

算法 —— 数组 目录算法 —— 数组1.二分查找1.1二分查找习题集2.双指针法2.1双指针法习题集3.滑动窗口3.1滑动窗口习题集4.二维数组4.1二维数组习题集1.二分查找 二分查找适用于&#xff0c;在有序排列的数组中查找某一指定元素。 其原理为范围搜索&#xff1a;如果这个元素…

opencv-python常用函数解析及参数介绍(四)——图像阈值

图像阈值处理前言1.改变图像颜色灰度图HSV图2.图像阈值图像中数值对应的效果函数与参数阈值处理效果前言 在很多任务当中&#xff0c;首要的任务就是对图像进行阈值处理&#xff0c;为后续其他操作做准备&#xff0c;本文将介绍5种阈值处理的方法以及参数设置&#xff0c;同时…

API 概述

API 概述目录概述需求&#xff1a;设计思路实现思路分析1.High-Level API &#xff1a;用于事务边界定义、控制及事务状态查询。2.2. High-Level API5.2.2 GlobalTransactionContextTransactionalTemplateLow-Level API参考资料和推荐阅读Survive by day and develop by night.…

网络协议总结

网络协议总结网络模型网络协议TCP/IP 模型网络接入层封装与解封装实际数据传输举例发送数据包接收数据包网络接口处理IP 模块处理TCP 模块处理应用程序处理网络构成通信介质与数据链路网卡二层交换机路由器 / 三层交换机![在这里插入图片描述](https://img-blog.csdnimg.cn/a8e…

F280049C General-Purpose Input/Out(GPIO)

​ 文章目录GPIO8.1 简介8.2 配置概述8.3 ADC引脚上的数字输入&#xff08;AIO&#xff09;8.4 数字通用I/O控制8.5 输入限定8.5.1 异步输入8.5.2 仅与SYSCLKOUT同步8.5.3 使用采样窗口进行鉴定8.6 SPI信号8.7GPIO和外设引脚复用8.7.1GPIO复用8.7.2 外设复用8.8 内部上拉配置要…

基础架构:一条SQL查询语句是如何执行的?

这是专栏的第一篇文章,我想来跟你聊聊 MySQL 的基础架构。我们经常说,看一个事儿千万不要直接陷入细节里,你应该先鸟瞰其全貌,这样能够帮助你从高维度理解问题。同样,对于 MySQL 的学习也是这样。平时我们使用数据库,看到的通常都是一个整体。比如,你有个最简单的表,表…

DML语句

DML语句目录概述需求&#xff1a;设计思路实现思路分析1.SQL 实例2.UPDATE3.DELETE4.SELECT5.是TRUNCATE参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wai…

数字DNA盗窃可能会在2023年到来

攻击者总是在不断发展并寻找访问数字系统的方法。随着人工智能的使用越来越多&#xff0c;量子计算有望很快成为现实&#xff0c;网络威胁格局的变化比以往任何时候都快。 当谈到网络安全时&#xff0c;我们应该始终尝试着眼于即将发生的事情以及它将产生的影响。我们不能只是…

操作系统实验7:终端设备字符显示的控制

实验目的 加深对操作系统设备管理基本原理的认识&#xff0c;实践键盘中断、扫描码等概念&#xff1b;通过实践掌握Linux 0.11对键盘终端和显示器终端的处理过程。 实验内容 本实验的基本内容是修改Linux 0.11的终端设备处理代码&#xff0c;对键盘输入和字符显示进行非常规…

2022-我的年终总结

去年年末&#xff0c;我也写了一篇年终总结。去年这一年是极度繁忙的一年&#xff0c;因各种原因&#xff0c;过年没回家&#xff0c;一个人在宿舍度过了凄凉的春节。而今年是丰收的一年&#xff0c;去年所付出的一切都在今年获得了回报&#xff0c;我也迎来新的生活。 新的生活…

过年春联不可少,python带你制作春联,体验不一样的过年氛围

前言 嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 又到了学Python时刻~ 每逢春节&#xff0c;无论城市还是农村&#xff0c; 家家户户都要挑漂亮的红春联贴于门上&#xff0c;辞旧迎新&#xff0c;增加喜庆的节日气氛。 据说这一习俗起于宋代&#xff0c;在明代开始盛…

我是阿豪我的2022年年终总结.

时光如白驹过隙般&#xff0c;飞逝而过&#xff0c;来不及细品岁月的美好。一晃&#xff0c;2022年就过去了&#xff01; 明天新的一年就来了。回忆一下2022一年都干了什么。 3月份背了大概200多道的前端面试题&#xff0c;疯狂的刷面试题&#xff0c;一天不刷几道面试题心里…