class QAbstractItemModel#

QAbstractItemModel类为项目模型类提供了一个抽象接口。 更多

Inheritance diagram of PySide6.QtCore.QAbstractItemModel

继承自: QFileSystemModelQAbstractItemModelReplicaQPdfBookmarkModelQHelpContentModelQStandardItemModelQConcatenateTablesProxyModelQAbstractTableModelQSqlQueryModelQSqlTableModelQSqlRelationalTableModelQAbstractProxyModelQTransposeProxyModelQSortFilterProxyModelQIdentityProxyModelQAbstractListModelQWebEngineHistoryModelQPdfSearchModelQPdfLinkModelQStringListModelQHelpIndexModel

概述#

方法#

虚方法#

信号#

注意

本文档可能包含从 C++ 自动翻译到 Python 的片段。我们始终欢迎对片段翻译的贡献。如果您发现翻译问题,也可以通过在 https:/bugreports.qt.io/projects/PYSIDE 上创建工单来通知我们。

详细描述#

QAbstractItemModel 类定义了项目模型必须使用的标准接口,以与其他模型/视图架构中的组件进行交互。它不应直接实例化。相反,您应该创建子类来创建新的模型。

QAbstractItemModel 类是模型/视图类之一,是 Qt 模型/视图框架的一部分。它可以作为 QML 中项目视图组件或 Qt Widgets 模块中项目视图类的底层数据模型。

如果您需要与项目视图(如QML的ListView元素或C++小部件QListView或QTableView)一起使用的模型,您应考虑继承自 QAbstractListModelQAbstractTableModel 而不是这个类。

底层数据模型作为表层次结构暴露给视图和代理。如果您不使用这个层次结构,那么模型就是一个简单的行和列的表格。每个数据项都有一个由 QModelIndex 指定的唯一索引。

../../_images/modelindex-no-parent.png

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

可以通过模型索引访问每个数据项的数据,可以使用 index() 函数来获取。每个索引可能有一个 sibling() 索引;子项有一个 parent() 索引。

每个项都有一组与之关联的数据元素,可以通过指定一个角色(见 ItemDataRole)和模型的 data() 函数来检索。可以使用 itemData() 函数同时获取所有可用角色的数据。

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

如果一项有子对象,hasChildren() 将返回对应索引的 true

该模型具有一个rowCount()和一个columnCount(),用于表示层次结构中的每个级别。可以通过insertRows()insertColumns()removeRows()removeColumns()来插入和删除行和列。

模型会发出信号以指示更改。例如,每当模型提供的数据项发生变化时,都会发出dataChanged()。对模型提供的表头所做的更改会导致headerDataChanged()的发出。如果底层数据结构发生变化,模型可以发出layoutChanged()来指示任何附加视图应重新显示任何显示的项,同时考虑新的结构。

可以通过match()函数在通过模型提供的数据项中搜索特定数据。

要排序模型,可以使用sort()

子类化#

注意

模型子类化的某些一般性指南可在模型子类化参考中找到。

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

您还可以重新实现 hasChildren() 方法,为那些 rowCount() 实现昂贵的模型提供特殊行为。这使得模型可以限制视图请求的数据量,并可以作为实现模型数据延迟Population的方法。

要启用模型中的编辑功能,还必须实现 setData(),并且重新实现 flags() 确保返回 ItemIsEditable。您还可以重新实现 headerData()setHeaderData() 以控制模型头部的显示方式。

在重新实现 setData()setHeaderData() 函数时,必须显式发出 dataChanged()headerDataChanged() 信号。

自定义模型需要为其他组件创建模型索引。为此,请使用适当的行和列数以及标识符调用 createIndex(),标识符可以是指针或整数值。这些值的组合必须对每个项都是唯一的。自定义模型通常在其他重新实现的函数中使用这些唯一标识符来检索项目数据以及访问项的父项和子项的相关信息。有关唯一标识符的更多信息,请参阅简单树模型示例。

不需要支持在 ItemDataRole 中定义的每个角色。根据模型中包含的数据类型,可能仅需要实现 data() 函数来返回对一些常用角色有效的信息。大多数模型至少为 DisplayRole 提供项目数据的文本表示,行为良好的模型还应该为 ToolTipRoleWhatsThisRole 提供有效信息。支持这些角色可以使用模型与标准的 Qt 视图一起使用。然而,对于处理高度专业数据的一些模型,可能仅为用户定义的角色提供数据是合适的。

提供可调整大小数据结构接口的模型可以提供 insertRows()removeRows()insertColumns()removeColumns() 的实现。在实现这些函数时,重要的是在它们发生之前和之后都通知任何连接的视图模型尺寸的变化

这些函数发出的/private信号在数据变得不可用之前给予附加组件采取行动的机会。使用这些begin和end函数对插入和删除操作进行封装,也使得模型能够正确管理

持久模型索引。**要正确处理选择,您必须确保调用这些函数**。如果您插入或删除带有子项的项目,则不需要为子项调用这些函数。换句话说,父项将处理其子项。

要创建逐步填充的模型,您可以重新实现fetchMore()canFetchMore()。如果fetchMore()的重实现向模型添加了行,则必须调用beginInsertRows()endInsertRows()

线程安全性

作为QObject的子类,QAbstractItemModel 不是 thread-safe。任何与 QAbstractItemModel 模型相关的 API 应仅从模型对象所在的线程中调用。如果 QAbstractItemModel 与视图相关联,这意味着 GUI 线程,因为视图位于该线程中,并且它将从 GUI 线程调用模型。使用后台线程填充或修改模型的内屏是可能的,但需要小心,因为后台线程不能直接调用任何与模型相关的 API。相反,您应该将更新排队并在主线程中应用。这可以通过排队连接来完成。

另请参阅

QModelIndexQAbstractItemViewUsingdrag and dropitem viewsSimple Tree Model ExampleEditable Tree Model ExampleFetch More Example

class LayoutChangeHint#

此枚举描述了模型改变布局的方式。

常量

描述

QAbstractItemModel.NoLayoutChangeHint

没有可用的提示。

QAbstractItemModel.VerticalSortHint

正在对行进行排序。

QAbstractItemModel.HorizontalSortHint

正在对列进行排序。

请注意,VerticalSortHint和HorizontalSortHint的含义是在同一父项内移动项目,而不是在模型中移动到不同的父项,也不是过滤或包括在内。

class CheckIndexOption#

(继承自 enum.Flag) 此枚举可以用于控制checkIndex() 方法执行的检查。

常量

描述

QAbstractItemModel.CheckIndexOption.NoOption

未指定任何检查选项。

QAbstractItemModel.CheckIndexOption.IndexIsValid

将模型索引传递给checkIndex()后,检查该索引是否为有效的模型索引。

QAbstractItemModel.CheckIndexOption.DoNotUseParent

不对传递给checkIndex()的索引的父项使用进行检查。

QAbstractItemModel.CheckIndexOption.ParentIsInvalid

将模型索引传递给checkIndex()的父项被检查以确定是否为无效模型索引。如果同时指定了此选项和DoNotUseParent,则忽略此选项。

__init__([parent=None])#
参数:

parentQObject

使用给定的parent构造一个抽象项模型。

beginInsertColumns(parent, first, last)#
参数:

警告

本节包含自动从C++转换为Python的代码片段,可能包含错误。

开始列插入操作。

在子类中重新实现insertColumns()时,必须在向模型的基本数据存储中插入数据之前调用此函数。

父索引 parent 对应于将新列插入其中的父元素;firstlast 是新列在插入后应有的列号。

modelview-begin-insert-columns1 插入列

指定插入你想在模型元素中插入的列范围的首列和末列编号。

例如,如图所示,我们在第4列之前插入三列,所以 first 是4,last 是6。

beginInsertColumns(parent, 4, 6)

这将三条新列插入为第4、5和6列。

modelview-begin-append-columns2 追加列

要追加列,请将它们插入到最后一个列之后。

例如,如图所示,我们在现有六列(以第5列为末尾)的集合后追加三列,所以 first 是6,last 是8。

beginInsertColumns(parent, 6, 8)

这将两条新列追加为第6、7和8列。

注意

此函数发出一个 columnsAboutToBeInserted() 信号,连接的视图(或代理)必须在数据插入前处理此信号。否则,视图可能会进入无效状态。

另请参阅

endInsertColumns()

beginInsertRows(parent, first, last)#
参数:

警告

本节包含自动从C++转换为Python的代码片段,可能包含错误。

开始行插入操作。

在子类中重新实现 insertRows() 时,必须在将数据插入模型的基础数据存储之前调用此函数。

parent 索引对应于新行要插入的父元素;firstlast 是新行插入后将具有的行号。

modelview-begin-insert-rows1 插入行

指定插入你想在模型元素中插入的行范围的首行和末行编号。

例如,如图所示,我们在第2行之前插入三行,所以 first 是2,last 是4。

beginInsertRows(parent, 2, 4)

这将三条新行插入为第2、3和4行。

modelview-begin-append-rows2 追加行

要追加行,请将它们插入到最后一个行之后。

例如,如图所示,我们在现有四行(以第3行为末尾)的集合后追加两行,所以 first 是4,last 是5。

beginInsertRows(parent, 4, 5)

这将两条新行追加为第4行和第5行。

注意

此函数发出rowsAboutToBeInserted()信号,视图(或代理)必须在此数据插入之前处理。否则,视图可能会处于无效状态。

另请参阅

endInsertRows()

beginMoveColumns(sourceParent, sourceFirst, sourceLast, destinationParent, destinationColumn)#
参数:
  • sourceParentQModelIndex

  • sourceFirst – int

  • sourceLast – int

  • destinationParentQModelIndex

  • destinationColumn – int

返回类型:

bool

开始列移动操作。

当重写子类时,此方法简化了在模型中移动实体的操作。此方法负责移动模型中的持久索引,否则您将需要自己完成。使用 beginMoveColumns 和 endMoveColumns是emit layoutAboutToBeChangedlayoutChanged直接,同时对changePersistentIndex的替代方案。

sourceParent索引对应于从中移动列的父级;sourceFirstsourceLast是将被移动列的第一列和最后一列号。destinationParent索引对应于将此列移动到的父级。destinationChild是列要移动到的列。也就是说,sourceParent中列sourceFirst的索引将变为destinationParent中列destinationChild的索引,然后是所有其他列,直到sourceLast

然而,当在同一父项下向下移动列时(sourceParentdestinationParent 相同),列将被放置在 destinationChild 索引之前。也就是说,如果您希望将列 0 和 1 移动,使其成为列 1 和 2,那么 destinationChild 应为 3。在这种情况下,源列 i(位于 sourceFirstsourceLast 之间)的新索引等于 (destinationChild-sourceLast-1+i)

注意,如果 sourceParentdestinationParent 相同,您必须确保 destinationChild 不在 sourceFirstsourceLast + 1 的范围内。您还必须确保不要尝试将列移动到其自身的子代或祖先。如果这两个条件中的任何一个为真,该方法返回 false,在这种情况下,您应该中止您的移动操作。

另请参阅

endMoveColumns()

beginMoveRows(sourceParent, sourceFirst, sourceLast, destinationParent, destinationRow)#
参数:
  • sourceParentQModelIndex

  • sourceFirst – int

  • sourceLast – int

  • destinationParentQModelIndex

  • destinationRow – int

返回类型:

bool

警告

本节包含自动从C++转换为Python的代码片段,可能包含错误。

开始行移动操作。

在重新实现子类时,此方法简化了模型中实体的移动。该方法负责移动模型中的持久性索引,否则您将不得不自己执行这些操作。使用 beginMoveRows 和 endMoveRows 是直接发出 layoutAboutToBeChangedlayoutChanged 信号并与 changePersistentIndex 结合的一种替代方法。

代码 sourceParent 的索引对应于行移动的父项;sourceFirstsourceLast 是要移动的行的第一行和最后一行号。代码 destinationParent 的索引对应于要移动这些行的父项。代码 destinationChild 是要将行移动到的行。也就是说,在 sourceParent 中的 sourceFirst 行的索引将成为 destinationParent 中的 destinationChild 行的索引,随后是其他所有至上至 sourceLast 的行。

但是,当在同一父项内向下移动行时(sourceParentdestinationParent 相同),这些行将被放置在 destinationChild 索引之前。也就是说,如果您想将0行和1行移动到它们成为1行和2行,那么 destinationChild 应该是3。在这种情况下,源行 i 的新索引(位于 sourceFirstsourceLast 之间)等于 (destinationChild-sourceLast-1+i)

请注意,如果 sourceParentdestinationParent 相同,您必须确保 destinationChild 不在 sourceFirstsourceLast + 1 的范围内。您还必须确保您不尝试将行移动到其自己的子项或祖先。如果满足这两种条件之一,此方法返回 false,在这种情况下,您应该中止您的移动操作。

modelview-move-rows-11 将行移动到另一个父项

在模型中指定您要在其中移动的源父项中要移动的行的第一行和最后一行号。也指定要将范围移动到目标父项中的行。

例如,如图所示,我们从源中移动2行到4行,因此 sourceFirst 为2,sourceLast 为4。我们将这些项目移动到目标中行2的上方,因此 destinationChild 为2。

beginMoveRows(sourceParent, 2, 4, destinationParent, 2)

这将从源中将三行行2、3和4移动到目的地,变为2、3和4。其他受影响的兄弟行相应地移位。

modelview-move-rows-22 将行移动到另一个父项的附加中

要将行附加到另一个父项,请将它们移到最后一行之后。

例如,如图所示,我们将三行移到由6行组成的集合(以行5结束),因此 destinationChild 为6。

beginMoveRows(sourceParent, 2, 4, destinationParent, 6)

这将从目标中将目标行移动到目标父项的末尾,为6、7和8。

modelview-move-rows-33 在同一父项内向上移动行

为了在同一父项内移动行,指定要移动它们的行。

例如,如图所示,我们将第二行的一项移动到第0行,所以 sourceFirstsourceLast 分别是 2,而 destinationChild 是 0。

beginMoveRows(parent, 2, 2, parent, 0)

请注意,其他行可能相应地被移动。还请注意,当在同一父项内移动项时,不应尝试无效或无操作的移动。在上面的例子中,移动物品2移动之前位于第2行,因此不能将其移动到第2行(其已存在的地方)或第3行(无操作,因为第3行表示在第3行之上,它本身已经是第3行)。

modelview-move-rows-44 在同一父项中向下移动行

为了在同一父项内移动行,指定要移动它们的行。

例如,如图所示,我们将第二行的一项目标到第四行,所以 sourceFirstsourceLast 分别是 2,而 destinationChild 是 4。

beginMoveRows(parent, 2, 2, parent, 4)

请注意,其他行可能相应地被移动。

另请参阅

endMoveRows()

beginRemoveColumns(parent, first, last)#
参数:

警告

本节包含自动从C++转换为Python的代码片段,可能包含错误。

开始进行列删除操作。

在派生类中 reimplementing removeColumns() 之前,您必须首先调用此函数。

parent 指数对应于将要从中删除新列的父级;firstlast 分别是要删除的第一列和最后一列的列号。

modelview-begin-remove-columns1 删除列

指定从模型中的项中删除的一组列的第一个和最后一个列号。

例如,如图所示,我们从第4列到第6列删除了三列,所以 first 是 4,而 last 是 6。

beginRemoveColumns(parent, 4, 6)

注意

此函数发出 columnsAboutToBeRemoved() 信号,连接的视图(或代理)必须在数据被删除之前处理。否则,视图可能会结束在无效状态。

另请参阅

endRemoveColumns()

beginRemoveRows(parent, first, last)#
参数:

警告

本节包含自动从C++转换为Python的代码片段,可能包含错误。

开始进行行删除操作。

在派生类中 reimplementing removeRows() 之前,您必须首先调用此函数。

parent 指数对应于将要从中删除新行的父级;firstlast 分别是要删除的第一行和最后一行的行号。

模型视图开始删除行1 删除行

指定模型中要删除行的起始和结束行号。

例如,如图所示,我们删除了第2行到第3行的两行,因此 first 为2,last 为3

beginRemoveRows(parent, 2, 3)

注意

此函数产生 rowsAboutToBeRemoved() 信号,连接的视图(或代理)在数据删除前必须处理。否则,视图可能会进入无效状态。

另请参阅

endRemoveRows()

beginResetModel()#

开始模型重置操作。

重置操作将模型重置到其当前状态中的任何附加视图。

注意

附加到此模型的所有视图也将重置。

当模型重置时,这意味着模型报告的任何先前数据现在都是无效的,并且必须再次查询。这也意味着当前项目以及任何选定的项目将变得无效。

当模型的数据发生根本变化时,有时只需调用此函数而不是发出 dataChanged() 以通知其他组件底层数据源或其结构已更改,这可能更容易。

在您的模型或代理模型中重置任何内部数据结构之前,您必须调用此函数。

此函数产生信号 modelAboutToBeReset() .

buddy(index)#
参数:

indexQModelIndex

返回类型:

QModelIndex

返回由 index 表示的项目伙伴的模型索引。当用户想要编辑一个项目时,视图将调用此函数来检查是否应该编辑模型中的另一个项目。然后,视图将使用由图书伙伴项目返回的模型索引构建一个代理。

此函数的默认实现使每个项目都是其自己的伙伴。

canDropMimeData(data, action, row, column, parent)#
参数:
返回类型:

bool

如果模型可以接受 data 的拖放操作,则返回 true。此默认实现仅检查 data 是否至少在 mimeTypes() 列表中有一个格式,以及 action 是否在模型的 supportedDropActions() 列表中。

如果您想测试数据是否可以在 rowcolumnparent 位置以及 action 下进行拖放,请在您的自定义模型中重写此函数。如果不需要这个测试,则不需要重写此函数。

另请参阅

dropMimeData() Using drag and drop with item views

canFetchMore(parent)#
参数:

parentQModelIndex

返回类型:

bool

如果为 parent 提供了更多数据,则返回 true;否则返回 false

默认实现始终返回 false

如果 canFetchMore() 返回 true,应该调用 fetchMore() 函数。例如,这是 QAbstractItemView 的行为。

另请参阅

fetchMore()

changePersistentIndex(from, to)#
参数:

将等于给定 from 模型索引的 QPersistentModelIndex 改变为给定的 to 模型索引。

如果没有找到等于给定 from 模型索引的持久模型索引,则不进行任何更改。

changePersistentIndexList(from, to)#
参数:
  • from – QModelIndex 的列表

  • to – QModelIndex 的列表

将等于给定 from 模型索引列表的 {QPersistentModelIndex} 转换为给定 to 模型索引列表。

如果在给定的 from 模型索引列表中没有找到等于的持久模型索引,则不做任何更改。

checkIndex(index[, options=QAbstractItemModel.CheckIndexOption.NoOption])#
参数:
返回类型:

bool

此函数检查 index 是否是该模型的有效模型索引。一个有效的模型索引可以是无效模型索引,也可以满足以下所有条件的有效模型索引:

  • 索引的模型是 this;

  • 索引的行大于或等于零;

  • 索引的行小于索引父项的行数;

  • 索引的列大于或等于零;

  • 索引的列小于索引父项的列数。

options 参数可以更改一些检查。如果 options 包含 IndexIsValid,则 index 必须是一个有效索引;这在重新实现期望有效索引的功能(例如 data()setData())时非常有用。

如果 options 包含 DoNotUseParent,则省略会调用 parent() 的检查;这允许从一个 parent() 的重新实现中调用此函数(否则,这会导致无限递归和崩溃)。

如果 options 不包含 DoNotUseParent,并且包含 ParentIsInvalid,那么将执行额外的检查:检查父索引是否无效。这在实现如列表或表格等平面模型时很有用,在这些模型中,不允许模型索引有有效的父索引。

此函数返回所有检查成功的值为 true,否则为 false。这允许在 Q_ASSERT 和类似的其他调试机制中使用该函数。如果有检查失败,将在 qt.core.qabstractitemmodel.checkindex 记录类别中打印警告信息,包含一些可能有助于调试失败的信息。

注意

此函数是用于实现自己的项目模型的调试辅助工具。在开发复杂模型以及构建复杂的模型层次结构(例如使用代理模型)时,调用此函数以便捕获由于意外将非法模型索引(如上所述)传递给一些 QAbstractItemModel API 而产生的错误非常有用。

警告

请注意,向项目模型传递非法索引是不确定的操作,因此应用程序必须避免这样做,并且不要依赖于项目模型可能采用的任何“防御性”编程来优雅地处理非法索引。

另请参阅

QModelIndex

clearItemData(index)#
参数:

indexQModelIndex

返回类型:

bool

删除给定 index 存储的所有角色数据。如果成功,则返回 true;否则返回 false。如果成功删除了数据,则应发出 dataChanged() 信号。基类实现返回 false

abstract columnCount([parent=QModelIndex()])#
参数:

parentQModelIndex

返回类型:

int

返回给定 parent 的子项列数。

在大多数子类中,列数与 parent 无关。

例如

int MyModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return 3;
}

注意

在实现基于表格的模型时,如果父项有效,columnCount() 应返回 0。

另请参阅

ーン行回车

columnsAboutToBeInserted(parent, first, last)#
参数:

此信号在列即将插入模型时发出。新项目将在firstlast之间(包含),位于给定的parent项目下。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

columnsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationColumn)#
参数:
  • sourceParentQModelIndex

  • sourceStart – int

  • sourceEnd – int

  • destinationParentQModelIndex

  • destinationColumn – int

此信号在列即将在模型中移动时发出。将要移动的项目是位于sourceStartsourceEnd之间(包含),位于给定的sourceParent项目下。它们将被移动到destinationParent,从列destinationColumn开始。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

另请参阅

beginMoveRows()

columnsAboutToBeRemoved(parent, first, last)#
参数:

此信号在列即将从模型中删除时发出。要删除的项目是位于firstlast之间(包含),位于给定parent项目下。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

columnsInserted(parent, first, last)#
参数:

在将列插入到模型后,会产生此信号。新的项是指在给定 parent 项下,从 firstlast(包括)之间的项目。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

columnsMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationColumn)#
参数:
  • sourceParentQModelIndex

  • sourceStart – int

  • sourceEnd – int

  • destinationParentQModelIndex

  • destinationColumn – int

在模型内部移动列之后产生此信号。从 sourceStartsourceEnd(包括)之间在指定的 sourceParent 项下的项已被移动到 destinationParent,并从列号 destinationColumn 开始。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

另请参阅

beginMoveRows()

columnsRemoved(parent, first, last)#
参数:

从模型中删除列后产生此信号。删除的项目是给定 parent 项下,从 firstlast(包括)之间的项目。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

createIndex(row, column, ptr)#
参数:
  • – int

  • – int

  • ptr – 对象

返回类型:

QModelIndex

为给定的行和列以及内部指针 ptr 创建模型索引。当使用 QSortFilterProxyModel 时,其索引有其自己的内部指针。不建议在模型之外访问此内部指针。请使用 data() 函数代替。此函数提供了一个模型子类必须使用的持久接口来创建模型索引。

警告

由于一些 Qt/Python 集成规则,ptr 参数在 QModelIndex 生命周期内不会增加引用。因此,在过程中必须保持 ptr 参数所使用的对象存活。如果您不确定这一点,不要销毁对象。

createIndex(row, column[, id=0])
参数:
  • – int

  • – int

  • idquintptr

返回类型:

QModelIndex

为指定的 rowcolumn 使用内部标识符 id 创建模型索引。

此函数提供了一种统一的接口,模型子类必须使用它来创建模型索引。

另请参阅

internalId()

摘要 data(index[, role=Qt.DisplayRole])#
参数:
返回类型:

对象

返回由 index 指向的项在给定 role 下存储的数据。

注意

如果没有值要返回,则返回一个无效的(默认构造的)QVariant

dataChanged(topLeft, bottomRight[, roles=list()])#
参数:

每当现有项中的数据更改时都会发出此信号。

如果项具有相同的父级,则受影响的项是从 topLeftbottomRight 包含的项。如果项没有相同的父级,则行为未定义。

在重写 setData() 函数时必须显式发出此信号。

可选的 roles 参数可以用来指定哪些数据角色已被修改。如果 roles 参数为空向量,则表示应考虑所有角色已修改。roles 参数中元素的顺序没有任何意义。

decodeData(row, column, parent, stream)#
参数:
返回类型:

bool

dropMimeData(data, action, row, column, parent)#
参数:
返回类型:

bool

处理由给定 action 结束的拖放操作提供的 data

如果模型处理了数据和操作,则返回 true;否则返回 false

指定的 rowcolumnparent 表示操作结束的位置在模型中的项。模型有责任在正确的位置完成操作。

例如,在一个 QTreeView 中的项上进行的拖动操作可以导致新项作为由 rowcolumnparent 指定的项的子项插入,或者作为该项的兄弟项。

rowcolumn 为 -1 时,表示应将放置的数据视为直接放置在 parent 上。通常这意味着将数据作为 parent 的子项追加。如果 rowcolumn 大于或等于零,则表示在指定的 parent 中的指定 rowcolumn 处发生了放置。

调用 mimeTypes() 成员来实现可接受的 MIME 类型的列表。此默认实现假定 mimeTypes() 的默认实现,它返回单个默认 MIME 类型。如果您在您的自定义模型中重新实现了 mimeTypes() 以返回多个 MIME 类型,则必须重新实现此函数以使用这些类型。

另请参阅

supportedDropActions() canDropMimeData() 使用项视图进行拖放和放置

encodeData(indexes, stream)#
参数:
endInsertColumns()#

结束列插入操作。

在子类中重写insertColumns() 函数时,您必须在将数据插入模型的基础数据存储后调用此函数。

另请参阅

beginInsertColumns()

endInsertRows()#

结束行插入操作。

在子类中重写insertRows() 函数时,您必须在将数据插入模型的基础数据存储后调用此函数。

另请参阅

beginInsertRows()

endMoveColumns()#

结束列移动操作。

在实现子类时,您必须在移动模型基础数据存储中的数据后调用此函数。

另请参阅

beginMoveColumns()

endMoveRows()#

结束行移动操作。

在实现子类时,您必须在移动模型基础数据存储中的数据后调用此函数。

另请参阅

beginMoveRows()

endRemoveColumns()#

结束列删除操作。

在子类中重写removeColumns() 函数时,您必须在从模型的基础数据存储中删除数据后调用此函数。

另请参阅

beginRemoveColumns()

endRemoveRows()#

结束行删除操作。

在子类中重写removeRows() 函数时,您必须在从模型的基础数据存储中删除数据后调用此函数。

另请参阅

beginRemoveRows()

endResetModel()#

完成模型重置操作。

您必须在对模型或代理模型中的任何内部数据结构进行重置后调用此函数。

此函数会发出信号 modelReset()

另请参阅

beginResetModel()

fetchMore(parent)#
参数:

parentQModelIndex

获取由父parent索引指定的项目的任何可用数据。

如果您正在增量填充模型,则应重写此函数。

默认实现不执行任何操作。

另请参阅

canFetchMore()

flags(index)#
参数:

indexQModelIndex

返回类型:

ItemFlag 的组合

返回给定 index 的项目标志。

基类实现返回的组合标志使项(ItemIsEnabled)可用,并允许选择该项(《ItemIsSelectable》)。

另请参阅

项目标志

hasChildren([parent=QModelIndex()])#
参数:

parentQModelIndex

返回类型:

bool

如果 parent 有任何子项,则返回 true;否则返回 false

使用父项上的 rowCount() 来找出子项的数量。

请注意,如果在具有 ItemNeverHasChildren 标志的情况下报告特定索引的 hasChildren,则这种行为是未定义的。

另请参阅

parent() index()

hasIndex(row, column[, parent=QModelIndex()])#
参数:
返回类型:

bool

如果模型为 rowcolumn以及 parent 返回一个有效的 QModelIndex,则返回 true;否则返回 false

headerData(section, orientation[, role=Qt.DisplayRole])#
参数:
  • section – int

  • orientationOrientation

  • role - int

返回类型:

对象

返回给定 rolesection 在指定 orientation 的表头中的数据。

对于水平表头,节号对应列号。同样地,对于垂直表头,节号对应行号。

headerDataChanged(orientation, first, last)#
参数:
  • orientationOrientation

  • first – int

  • last – int

每当头部发生变化时,都会发出此信号。orientation 表示水平或垂直头部是否发生变化。需要更新从firstlast的头部部分。

在重新实现setHeaderData()函数时,必须显式发出此信号。

如果您正在更改列数或行数,则不需要发出此信号,而是使用begin/end函数(请参阅QAbstractItemModel类描述中的子类章节以获取详细信息)。

另请参阅

headerData() setHeaderData() dataChanged()

抽象 index(row, column[, parent=QModelIndex()])#
参数:
返回类型:

QModelIndex

返回由给定的rowcolumnparent索引指定的模型中项的索引。

在子类中重新实现此函数时,调用createIndex()以生成模型索引,其他组件可以使用这些索引来引用模型中的项。

另请参阅

createIndex()

insertColumn(column[, parent=QModelIndex()])#
参数:
返回类型:

bool

在指定parent的子项中,在给定的column之前插入一个单列。

如果列已插入,则返回true;否则返回false

另请参阅

insertColumns() insertRow() removeColumn()

insertColumns(column, count[, parent=QModelIndex()])#
参数:
返回类型:

bool

对于支持此功能的数据模型,在指定的 column 前插入 count 个新列。新列中的项目将是子项的表示,由 parent 模型索引表示的项。

如果 column 是 0,则将新列插入到现有列之前。

如果 column 等于 columnCount() ,则将新列附加到现有列之后。

如果 parent 没有子项,则插入一行具有 count 列。

如果成功插入列,则返回 true;否则返回 false

基类实现不执行任何操作并返回 false

如果您实现了自己的模型,您可以根据需要重新实现此函数以支持插入操作。或者,您可以为更改数据提供自己的 API。

insertRow(row[, parent=QModelIndex()])#
参数:
返回类型:

bool

在指定的 row 所指定的父项子项之前插入一行。

注意

此函数调用虚方法 insertRows

如果行成功插入,则返回 true;否则返回 false

insertRows(row, count[, parent=QModelIndex()])#
参数:
返回类型:

bool

注意

该函数的基本类实现不执行任何操作,并返回 false

对于支持此功能的数据模型,在给定的 row 之前向模型中插入 count 行。新行的项目将作为由 parent 模型索引表示的项目子项。

如果 row 是 0,则将这些行 prepend 到父项中任何现有行之前。

如果 row 等于 rowCount() ,则将这些行 append 到父项中任何现有行之后。

如果 parent 没有子项,则插入一个由 count 行组成的单一列。

如果成功插入行,则返回 true;否则返回 false

如果您实现了自己的模型,则可以根据需要重新实现此函数以支持插入。或者,您可以提供更改数据的自己的 API。在任何情况下,您都需要调用 beginInsertRows()endInsertRows() 来通知其他组件模型已更改。

itemData(index)#
参数:

indexQModelIndex

返回类型:

类型为 int 的键和类型为 QVariant 的值的字典。

返回一个映射,其中包含给定 index 处的项目的所有预定义角色的值。

如果您想扩展此函数的默认行为,以包含映射中的自定义角色,则应重新实现此函数。

layoutAboutToBeChanged([parents=list()[, hint=QAbstractItemModel.NoLayoutChangeHint]])#
参数:

这个信号在模型布局即将改变之前发出。连接到该信号的组件可以使用它来适应模型布局的变化。

子类应该在发出 layoutAboutToBeChanged() 之后更新任何持久模型索引。

可选的 parents 参数用于提供有关模型布局中哪些部分正在更改的更具体的通知。空列表表示整个模型布局的改变。列表中元素的顺序不重要。可选的 hint 参数用于在模型重排期间提供提示。

layoutChanged([parents=list()[, hint=QAbstractItemModel.NoLayoutChangeHint]])#
参数:

这个信号会在模型暴露的项的布局发生变化时发出;例如,当模型已排序时。当视图接收到该信号时,应更新项的布局以反映这种变化。

在子类化 QAbstractItemModelQAbstractProxyModel 时,确保在更改项的顺序或更改向视图公开的数据的结构之前发出 layoutAboutToBeChanged(),并且在布局变更后发出 layoutChanged()。

可选的 parents 参数用于提供有关模型布局中哪些部分正在更改的更具体的通知。空列表表示整个模型布局的改变。列表中元素的顺序不重要。可选的 hint 参数用于在模型重排期间提供提示。

子类应该在发出 layoutChanged() 之前更新任何持久模型索引。换句话说,当结构发生变化时

match(start, role, value[, hits=1[, flags=Qt.MatchFlags(Qt.MatchStartsWith|Qt.MatchWrap)]])#
参数:
返回类型:

. QModelIndex 列表

返回一个列表,包含与在 start 指索引列中的数据存储的数据项在给定的 role 下匹配指定的 valueQModelIndex。搜索方式由给定的 flags 定义。返回的列表可能为空。请注意,如果使用代理模型,列表中结果的顺序可能与模型中的顺序不对应,因此结果的顺序不可靠。

搜索从 start 指索引开始,直到匹配的数据项数量等于 hits、搜索达到最后一行或搜索再次到达 start,具体取决于是否在 flags 中指定了 MatchWrap。如果您想搜索所有匹配项,请使用 hits = -1。

默认情况下,此函数将对所有项执行基于文本的环绕比较,搜索以 value 指定的搜索词开头的项。

注意

此函数的默认实现仅搜索列。重新实现此函数以包括不同的搜索行为。

mimeData(indexes)#
参数:

indexes – .QModelIndex 列表

返回类型:

QMimeData

返回一个包含对应于指定的 indexes 列表的数据项序列化对象的函数。用于描述编码数据的格式是从 mimeTypes() 函数获得的。默认实现使用 mimeTypes() 的默认实现返回的默认 MIME 类型。如果在你自定义的模型中重写 mimeTypes() 以返回更多的 MIME 类型,则需要重写此函数以使用它们。

如果 indexes 列表为空,或者没有支持的 MIME 类型,则返回 None 而不是序列化的空列表。

mimeTypes()#
返回类型:

字符串列表

返回允许的 MIME 类型列表。默认情况下,内置的模型和视图使用一个内部 MIME 类型: application/x-qabstractitemmodeldatalist

在自定义模型中实现拖放支持时,如果您将以除了默认内部 MIME 类型之外的其他格式返回数据,则需要重写此函数以返回您的 MIME 类型列表。

如果您在自定义模型中重写此函数,还必须重写调用它的成员函数: mimeData()dropMimeData()

另请参阅

mimeData() dropMimeData()

modelAboutToBeReset()#

当调用 beginResetModel() 时,在模型内部状态(例如持久性模型索引)被无效化之前,会发出此信号。

modelReset()#

当调用 endResetModel() 方法后,模型内部状态(例如持久化模型索引)被无效化时,会发出此信号。

请注意,如果模型被重置,则应考虑之前从中检索到的所有信息都是无效的。这包括但不限于 rowCount()columnCount()flags() ,通过 data() 获取的数据,以及 roleNames()

moveColumn(sourceParent, sourceColumn, destinationParent, destinationChild)#
参数:
  • sourceParentQModelIndex

  • sourceColumn – int

  • destinationParentQModelIndex

  • destinationChild – int

返回类型:

bool

在支持此功能的模型上,将 sourceColumnsourceParent 移动到 destinationChild 下的 destinationParent

如果列成功移动,则返回 true;否则返回 false

另请参阅

moveColumns() moveRow()

moveColumns(sourceParent, sourceColumn, count, destinationParent, destinationChild)#
参数:
  • sourceParentQModelIndex

  • sourceColumn – int

  • count – 整数

  • destinationParentQModelIndex

  • destinationChild – int

返回类型:

bool

在支持此功能的模型上,将起始于给定 sourceColumncount 列从父项 sourceParent 下移动到父项 destinationParentdestinationChild 下的列。

如果列成功移动,则返回 true;否则返回 false

基类实现不执行任何操作并返回 false

如果您实现了自己的模型,您可以根据需要支持移动来重写此函数。或者,您可以提供自己的API来更改数据。

moveRow(sourceParent, sourceRow, destinationParent, destinationChild)#
参数:
返回类型:

bool

在支持该功能的模型上,将 sourceRowsourceParent 移动到 destinationChild 下的 destinationParent

如果行成功移动,则返回 true;否则返回 false

另请参阅

moveRows() moveColumn()

moveRows(sourceParent, sourceRow, count, destinationParent, destinationChild)#
参数:
  • sourceParentQModelIndex

  • sourceRow – int

  • count – 整数

  • destinationParentQModelIndex

  • destinationChild – int

返回类型:

bool

在支持此功能的模型中,将起始 sourceRowcount 行从父 sourceParent 移动到父 destinationParent 下的 destinationChild

如果行成功移动,则返回 true;否则返回 false

基类实现不执行任何操作并返回 false

如果您实现了自己的模型,您可以根据需要支持移动来重写此函数。或者,您可以提供自己的API来更改数据。

抽象parent(child)#
参数:

childQModelIndex

返回类型:

QModelIndex

返回具有给定 index 的模型项的父项。如果项没有父项,则返回一个无效的 QModelIndex

在公开树数据结构的模型中,常见的约定是,只有第一列的项有子项。对于这种情况下,在子类中重新实现此函数时,返回的 QModelIndex 的列将会是 0。

在子类中重新实现此函数时,请注意避免调用像是 QModelIndex 成员函数,例如 parent() ,因为这些属于你的模型,将简单调用你的实现,导致无限递归。

另请参阅

createIndex()

persistentIndexList()#
返回类型:

. QModelIndex 列表

返回存储在模型中的持久索引列表。

removeColumn(column[, parent=QModelIndex()])#
参数:
返回类型:

bool

从父项指定的 parent 子项中删除指定的 column

如果删除列则返回 true,否则返回 false

removeColumns(column, count[, parent=QModelIndex()])#
参数:
返回类型:

bool

支持此功能的模型上,从指定在父项 parent 下以给定 column 开始的 count 列从模型中删除。

如果列成功删除则返回 true,否则返回 false

基类实现不执行任何操作并返回 false

如果你实现了自己的模型,你可以重新实现此函数以支持删除。或者,你也可以提供一个用于修改数据的自定义 API。

removeRow(row[, parent=QModelIndex()])#
参数:
返回类型:

bool

从指定的 parent 指定的子项中移除给定的 row

如果行已被移除,则返回 true;否则返回 false

这是一个方便的函数,它调用 removeRows()。在 QAbstractItemModelremoveRows() 实现中,什么都不做。

removeRows(row, count[, parent=QModelIndex()])#
参数:
返回类型:

bool

在支持此功能的情况下,从父项 parent 下的模型中移除从给定 row 开始的 count 行。

如果行被成功移除,则返回 true;否则返回 false

基类实现不执行任何操作并返回 false

如果你实现了自己的模型,你可以重新实现此函数以支持删除。或者,你也可以提供一个用于修改数据的自定义 API。

resetInternalData()#

警告

本节包含自动从C++转换为Python的代码片段,可能包含错误。

当模型的重置过程中清除了内部数据后,会调用此槽。

此插槽为具体代理模型的子类提供了便利,例如 QSortFilterProxyModel 的子类,它们维护额外的数据。

class CustomDataProxy(QSortFilterProxyModel):

    Q_OBJECT
# public
    CustomDataProxy(QObject parent)
    super().__init__(parent)


    ...
    QVariant data(QModelIndex index, int role) override

        if role != Qt.BackgroundRole:
            return QSortFilterProxyModel.data(index, role)
        if m_customData.contains(index.row()):
            return m_customData.value(index.row())
        return QSortFilterProxyModel.data(index, role)

# private slots
    def resetInternalData():

        m_customData.clear()

# private
QVariant> = QHash<int,()

注意

由于一个错误,此插槽在 Qt 5.0 中缺失。

revert()#

通知模型应该丢弃缓存的信息。此函数通常用于行编辑。

另请参阅

submit()

roleNames()#
返回类型:

键为.int类型,值为.QByteArray类型的字典。

返回模型的角色名称。

Qt设置默认角色名称如下:

Qt 角色

QML 角色名称

DisplayRole

显示

DecorationRole

装饰

EditRole

编辑

ToolTipRole

工具提示

StatusTipRole

状态提示

WhatsThisRole

这是什么

abstract rowCount([parent=QModelIndex()])#
参数:

parentQModelIndex

返回类型:

int

返回给定parent下的行数。当parent有效时,意味着rowCount返回的是parent的子项数量。

注意

在实现基于表的模型时,当parent有效时,rowCount()应返回0。

另请参阅

columnCount()

rowsAboutToBeInserted(parent, first, last)#
参数:

在将行插入模型之前发出此信号。新项目将被放置在startend之间(包括端点),在给定的parent项下。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

rowsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationRow)#
参数:
  • sourceParentQModelIndex

  • sourceStart – int

  • sourceEnd – int

  • destinationParentQModelIndex

  • destinationRow – int

在模型内部移动行之前发出此信号。将要移动的项目是那些在sourceStartsourceEnd之间(包括端点),在给定的sourceParent项下。它们将被移动到destinationParent,从行destinationRow开始移动。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

另请参阅

beginMoveRows()

rowsAboutToBeRemoved(parent, first, last)#
参数:

此信号在从模型中删除行之前发出。将被删除的项目是在给定 parent 项下,从 firstlast(包含两端)范围内的项目。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

rowsInserted(parent, first, last)#
参数:

此信号在将行插入模型之后发出。新项是在给定 parent 项下,从 firstlast(包含两端)范围内的项目。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

rowsMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationRow)#
参数:
  • sourceParentQModelIndex

  • sourceStart – int

  • sourceEnd – int

  • destinationParentQModelIndex

  • destinationRow – int

此信号在模型内移动行之后发出。从 sourceStartsourceEnd(包含两端)范围内的项目,在给定 sourceParent 项下,已移动到 destinationParent,并从行号 destinationRow 开始。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

另请参阅

beginMoveRows()

rowsRemoved(parent, first, last)#
参数:

此信号在从模型中删除行之后发出。被删除的项目是在给定 parent 项下,从 firstlast(包含两端)范围内的项目。

注意

连接到此信号的组件使用它来适应模型维度变化。它只能由QAbstractItemModel的实现发出,不能在子类代码中显式发出。

setData(index, value[, role=Qt.EditRole])#
参数:
返回类型:

bool

将索引为 index 的项的 role 数据设置为 value

若成功则返回 true;否则返回 false

如果数据被成功设置,应发射 dataChanged() 信号。

基本类实现返回 false。对于可编辑模型,必须重新实现此函数和 data() 函数。

setHeaderData(section, orientation, value[, role=Qt.EditRole])#
参数:
  • section – int

  • orientationOrientation

  • value – 对象

  • role - int

返回类型:

bool

将给定 rolesection 的头部数据设置为指定的 orientationvalue 值。

如果更新了头部的数据,则返回 true;否则返回 false

在重新实现此函数时,必须显式发射 headerDataChanged() 信号。

另请参阅

ItemDataRole headerData()

setItemData(index, roles)#
参数:
  • indexQModelIndex

  • roles – 类型为 .int 的键和类型为 QVariant 的值的字典。

返回类型:

bool

index 处项目的作用域数据设置为 roles 中关联的值,适用于每个 ItemDataRole

若成功则返回 true;否则返回 false

不在 roles 中的作用域将不会被修改。

另请参阅

setData() data() itemData()

sibling(row, column, idx)#
参数:
返回类型:

QModelIndex

返回位于 index 的项在 rowcolumn 位置的兄弟项,如果没有该位置的兄弟项,则返回一个无效的 QModelIndex

sibling() 是一个方便函数,用于找到项的父项,并使用它来检索指定 rowcolumn 下的子项索引。

此方法可以针对特定的优化进行覆盖。

另请参阅

index() row() column()

sort(column[, order=Qt.AscendingOrder])#
参数:

按给定的 order 对模型按 column 排序。

基类实现不执行任何操作。

span(index)#
参数:

indexQModelIndex

返回类型:

QSize

返回由 index 表示的项的行和列跨度。

注意

目前,未使用span。

submit()#
返回类型:

bool

让模型知道它应该将缓存的信息提交到永久存储。此函数通常用于行编辑。

如果没有错误,返回 true;否则返回 false

另请参阅

revert()

supportedDragActions()#
返回类型:

DropAction 的组合

返回本模型数据所支持的操作。

默认实现返回 supportedDropActions() 。如果您想支持额外的操作,则需重写此函数。

supportedDragActions 用于在拖动发生时作为 QAbstractItemViewstartDrag() 的默认值。

另请参阅

DropActions 使用 dragdropitem views

supportedDropActions()#
返回类型:

DropAction 的组合

返回此模型支持的下拽操作。

默认实现返回 CopyAction 。如果您想支持额外的操作,则需重写此函数。同时您还需要重写 dropMimeData() 函数以处理额外的操作。

另请参阅

dropMimeData() 下拽操作