205.PyQt5_QAbstractItemModel_数据模型类基类

QAbstractItemModel是Qt所有模型类的基类,用于管理模型/视图结构中的数据。子类化QAbstractItemModel可以创建自定义模型,常用于Qt的GUI组件如QListView和QTableView。模型索引通过QModelIndex获取,数据通过角色(Qt.ItemDataRole)访问。子类化时至少需要实现index(), parent(), flags(), data()等方法。此外,还涉及插入、删除、移动行和列的操作,并需处理数据改变的信号。" 137249735,16620031,华为OD机试解析:数字加减游戏的最小操作次数,"['华为OD机试', '算法', 'JavaScript']
摘要由CSDN通过智能技术生成

无奋斗不青春

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈
入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈
虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈
PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈
Oracle数据库教程:👉👉 Oracle数据库文章合集 👈👈
优 质 资 源 下 载 :👉👉 资源下载合集 👈👈
优 质 教 程 推 荐:👉👉 Python爬虫从入门到入狱系列 合集👈👈

分隔线

QAbstractItemModel 模型类基类

描述
  • 该类是Qt所有模型类的基类,用于管理模型/视图结构中的数据。Qt的所有模型都需要子类化该类

  • QAbstractItemModel 类定义了项目模型必须使用的标准接口,以便能够与模型/视图框架中的其他组件进行互操作

  • 正确用法是将其子类化以创建新模型。

  • 例如:一个模型与项目视图一起使用,QML的列表视图元素或QListView或QTableView,则应该考虑子类化QAbstractListModel或QAbstractTableModel而不是此类

  • 底层数据模型作为表的层次结构公开给视图和委托。如果不使用层次结构,那么模型就是一个简单的行和列表。每个项目都有一个由QModelIndex指定的唯一索引

  • 在这里插入图片描述

  • 可以通过模型访问的每一项数据都有一个关联的模型索引。您可以使用index()函数获得该模型索引。每个索引可以有一个sibling()索引;子项目有一个parent()索引

  • 每个项目都有许多与之相关的数据元素,并且可以通过向模型的data()函数指定一个角色来检索它们。可以使用itemData()函数同时获得所有可用角色的数据

  • 每个角色的数据是使用特定的Qt.ItemDataRole设置的。单个角色的数据可以用setData()单独设置,也可以用setItemData()为所有角色设置

  • 可以使用flags()查询项,以查看它们是否可以被选择、拖动或以其他方式操作

  • 如果一个项有子对象,hasChildren()会为相应的索引返回true

  • 对于层次结构的每个级别,模型都有一个rowCount()和一个columnCount()。可以使用insertRows()、insertColumns()、removeRows()和removeColumns()来插入和删除行和列

  • 可以使用match()函数搜索模型中可用的项以查找特定数据

  • 要对模型进行排序,可以使用sort()

  • 继承自:QObject

  • 继承关系图

  • 在这里插入图片描述

    QFileSystemModel
        # 为本机的文件系统提供一个数据模型,可用于访问本机的文件系统。
        # 比如和QTreeView视图组件结合使用,可以用目录树的形式显示本机上的文件系统,类似Windows的文件资源管理器。
        # 使用QFileSystemModel提供的接口函数,可以创建目录、删除目录、重命名目录,可以获得文件名称、目录名称、文件大小等参数,可以获得文件的详细信息
        
    QDirModel
        # 为本机的盘符目录提供一个数据模型,可用于访问本机的磁盘路径
        
    QStringListModel
        # 用于处理字符串列表的数据模型,可以作为QListView的数据模型,在界面上显示和编辑字符串列表。
    
    QStandardItemModel
        # 以项数据(item data)为基础的标准数据结构模型类,通常与QTableView配合使用,实现通用的二维数据的管理
    
    QSortFilterProxyModel
        # 与其他数据模型结合,提供排序和过滤功能的数据模型
    
    QSqlQueryModel
        # 用于数据库SQL查询结果的数据模型
    
    QSqlTableModel
        # 用于数据库的一个数据表的数据模型
    
    QSqlRelationalTableModel
        # 用于关系型数据表的数据模型
    
  • 有效模型索引的创建

    • 模型索引是由QModelIndex类进行描述的,但该类只有一个默认构造函数,而使用默认构造函数创建的模型索引是无效模型索引
    • 因此要创建一个有效的模型索引,需要使用工厂函数QAbstractItemModel.createIndex()来创建
    • 在重新实现纯虚函数 index()和 parent()时,都有可能会调用该工厂函数来创建模型索引

子类化QAbstractItemModel
  • 注意:在模型子类化参考中有一些关于子类化模型的一般指导原则

  • 当子类化QAbstractItemModel时,至少您必须实现index()parent()rowCount()columnCount()data()。这些函数用于所有只读模型,并构成可编辑模型的基础

  • 可以重新实现hasChildren(),以便为rowCount()的实现开销较大的模型提供特殊行为。这使得模型可以限制视图请求的数据量,并且可以用作实现模型数据延迟填充的方法

  • 要在模型中启用编辑,您还必须实现setData(),并重新实现flags(),以确保返回itemeseditable。您还可以重新实现headerData()和setHeaderData()来控制显示模型标题的方式

  • 在重新实现setData()和setHeaderData()函数时,必须分别显式地发出datachchanged()和headerdatachchanged()信号

  • 自定义模型需要创建模型索引以供其他组件使用。为此,调用createIndex(),为项目提供合适的行和列号,以及它的标识符,可以是指针,也可以是整数值。这些值的组合对于每个项目必须是唯一的。

  • 自定义模型通常在其他重新实现的函数中使用这些唯一标识符来检索项数据并访问关于项的父项和子项的信息

  • 没有必要支持Qt.ItemDataRole中定义的每个角色。根据模型中包含的数据类型,可能只有实现data()函数为某些更常见的角色返回有效信息时才有用。

  • 大多数模型至少为Qt.DisplayRole提供项目数据的文本表示,并且行为良好的模型也应该为Qt.ToolTipRole和Qt.WhatsThisRole提供有效的信息。支持这些角色可以使模型与标准Qt视图一起使用。然而,对于一些处理高度专门化数据的模型,仅为用户定义的角色提供数据可能是合适的。

  • 在这里插入图片描述

  • 角色是枚举类型 Qt.ItemDataRole,有多种取值

    Qt.DisplayRole          # 0,在视图组件中显示的字符串
    Qt.DecorationRole       # 1,在视图组件中显示的图标装饰(数据为QColor/ QIcon/ QPixmap)
    Qt.EditRole             # 2,编辑器中正在编辑的数据
    Qt.ToolTipRole          # 3,工具提示中显示的数据(鼠标移动到项目上显示的提示信息)
    Qt.StatusTipRole        # 4,状态栏中显示的数据
    Qt.WhatsThisRole        # 5,"What’s This?"模式下显示的数据
    Qt.SizeHintRole         # 13,将会应用到视图的数据项的大小提示
    Qt.UserRole             # 是自定义数据
    
  • 为可调整大小的数据结构提供接口的模型可以提供insertRows()、removeRows()、insertColumns()和removeColumns()的实现。在实现这些功能时,重要的是要在模型维度发生变化之前和之后通知所有连接的视图:

    insertRows()实现
        # 必须在将新行插入数据结构之前调用beginInsertRows()
        # 然后立即调用endInsertRows()。
    insertColumns()实现
        # 必须在向数据结构插入新列之前调用beginInsertColumns()
        # 然后立即调用endInsertColumns()
    removeRows()实现
        # 必须在从数据结构中删除行之前调用beginRemoveRows()
        # 然后立即调用endRemoveRows()。
    removeColumns()实现
        # 必须在从数据结构中删除列之前调用beginRemoveColumns()
        # 然后立即调用endRemoveColumns()
    
  • 这些函数发出的私有信号使附加的组件有机会在任何数据不可用之前采取行动。使用这些begin和end函数封装插入和删除操作还使模型能够正确地管理持久模型索引。

  • 如果希望正确处理选择,必须确保调用了这些函数。如果插入或删除带有子条目的条目,则不需要为这些子条目调用这些函数。换句话说,父项将照顾它的子项。

  • 要创建增量填充的模型,您可以重新实现fetchMore()和canFetchMore()。如果fetchMore()的重新实现将行添加到模型中,则必须调用beginInsertRows()和endInsertRows()。


常用枚举
  • QAbstractItemModel.CheckIndexOptions
  • 该枚举可用于控制QAbstractItemModel.checkIndex()执行的检查
    枚举 说明
    QAbstractItemModel.CheckIndexOption.NoOption 0x0000 没有指定检查选项
    QAbstractItemModel.CheckIndexOption.IndexIsValid 0x0001 将传递给QAbstractItemModel.checkIndex()的模型索引检查为有效的模型索引
    QAbstractItemModel.CheckIndexOption.DoNotUseParent 0x0002 不执行任何涉及传递给QAbstractItemModel.checkIndex()的索引的父索引的使用的检查
    QAbstractItemModel.CheckIndexOption.ParentIsInvalid 0x0004 传递给QAbstractItemModel.checkIndex()的模型索引的父级被检查为无效的模型索引。如果同时指定了该选项和donotusparent,则忽略该选项
  • QAbstractItemModel.LayoutChangeHint
  • 模型改变布局的方式
    枚举
    QAbstractItemModel.NoLayoutChangeHint 0 没有任何提示
    QAbstractItemModel.VerticalSortHint 1 行正在排序
    QAbstractItemModel.HorizontalSortHint 2 列正在排序
常用API
  • 构造函数

    QAbstractItemModel()                                    # 构造一个空的抽象项模型
    QAbstractItemModel(QObject *parent = nullptr)           # 构造具有给定父项的抽象项模型
    
  • 缓存处理

    revert()                                                # 丢弃缓存的信息。此函数通常用于行编辑
    submit()                                                # 将缓存的信息提交到永久存储。此函数通常用于行编辑
    
  • 获取行列数

    # 返回给定父元素的子元素的列数
    columnCount(QModelIndex &parent = QModelIndex())
    
    # 返回给定父项下的行数
    rowCount(const QModelIndex &parent = QModelIndex(
  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

失心疯_2023

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值