- class QAbstractItemModel#
QAbstractItemModel
类为项目模型类提供了一个抽象接口。 更多…继承自:
QFileSystemModel
、QAbstractItemModelReplica
、QPdfBookmarkModel
、QHelpContentModel
、QStandardItemModel
、QConcatenateTablesProxyModel
、QAbstractTableModel
、QSqlQueryModel
、QSqlTableModel
、QSqlRelationalTableModel
、QAbstractProxyModel
、QTransposeProxyModel
、QSortFilterProxyModel
、QIdentityProxyModel
、QAbstractListModel
、QWebEngineHistoryModel
、QPdfSearchModel
、QPdfLinkModel
、QStringListModel
、QHelpIndexModel
概述#
方法#
定义
checkIndex()
定义
decodeData()
定义
encodeData()
定义
hasIndex()
定义
insertRow()
def
移动列()
def
移动行()
def
持久索引列表()
def
移除列()
def
移除行()
虚方法#
def
获取伙伴()
def
支持拖放数据?
def
可以更快地获取数据
def
清除项数据()
def
列数()
def
获取数据()
def
拖放数据()
def
获取更多数据()
def
获取标志位()
def
是否存在子项?
def
头部数据()
def
索引()
def
插入列()
def
插入行()
def
项数据()
def
匹配数据()
定义
mimeData()
定义
mimeTypes()
定义
moveRows()
定义
parent()
定义
removeRows()
定义
revert()
定义
roleNames()
定义
rowCount()
定义
setData()
定义
sibling()
定义
sort()
定义
span()
定义
submit()
信号#
定义
modelReset()
定义
rowsMoved()
注意
本文档可能包含从 C++ 自动翻译到 Python 的片段。我们始终欢迎对片段翻译的贡献。如果您发现翻译问题,也可以通过在 https:/bugreports.qt.io/projects/PYSIDE 上创建工单来通知我们。
详细描述#
QAbstractItemModel
类定义了项目模型必须使用的标准接口,以与其他模型/视图架构中的组件进行交互。它不应直接实例化。相反,您应该创建子类来创建新的模型。QAbstractItemModel
类是模型/视图类之一,是 Qt 模型/视图框架的一部分。它可以作为 QML 中项目视图组件或 Qt Widgets 模块中项目视图类的底层数据模型。如果您需要与项目视图(如QML的ListView元素或C++小部件QListView或QTableView)一起使用的模型,您应考虑继承自
QAbstractListModel
或QAbstractTableModel
而不是这个类。底层数据模型作为表层次结构暴露给视图和代理。如果您不使用这个层次结构,那么模型就是一个简单的行和列的表格。每个数据项都有一个由
QModelIndex
指定的唯一索引。可以通过模型访问的每个数据项都有一个关联的模型索引。您可以使用
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
提供项目数据的文本表示,行为良好的模型还应该为ToolTipRole
和WhatsThisRole
提供有效信息。支持这些角色可以使用模型与标准的 Qt 视图一起使用。然而,对于处理高度专业数据的一些模型,可能仅为用户定义的角色提供数据是合适的。提供可调整大小数据结构接口的模型可以提供
insertRows()
、removeRows()
、insertColumns()
和removeColumns()
的实现。在实现这些函数时,重要的是在它们发生之前和之后都通知任何连接的视图模型尺寸的变化insertRows()
的实现必须在将新行插入到数据结构之前调用beginInsertRows()
,并在之后立即调用endInsertRows()
。insertColumns()
的实现必须在将新列插入到数据结构之前调用beginInsertColumns()
,并在之后立即调用endInsertColumns()
。removeRows()
的实现必须在从数据结构中删除行之前调用beginRemoveRows()
,并在之后立即调用endRemoveRows()
。《removeColumns()`》方法的实现必须在从数据结构中删除列之前调用 `
beginRemoveColumns()
`,之后立即调用 `endRemoveColumns()
`。
这些函数发出的/private信号在数据变得不可用之前给予附加组件采取行动的机会。使用这些begin和end函数对插入和删除操作进行封装,也使得模型能够正确管理
持久模型索引。**要正确处理选择,您必须确保调用这些函数**。如果您插入或删除带有子项的项目,则不需要为子项调用这些函数。换句话说,父项将处理其子项。
要创建逐步填充的模型,您可以重新实现
fetchMore()
和canFetchMore()
。如果fetchMore()
的重实现向模型添加了行,则必须调用beginInsertRows()
和endInsertRows()
。线程安全性
作为QObject的子类,
QAbstractItemModel
不是 thread-safe。任何与QAbstractItemModel
模型相关的 API 应仅从模型对象所在的线程中调用。如果QAbstractItemModel
与视图相关联,这意味着 GUI 线程,因为视图位于该线程中,并且它将从 GUI 线程调用模型。使用后台线程填充或修改模型的内屏是可能的,但需要小心,因为后台线程不能直接调用任何与模型相关的 API。相反,您应该将更新排队并在主线程中应用。这可以通过排队连接来完成。另请参阅
QModelIndex
、QAbstractItemViewUsing
、drag and drop
与item 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,则忽略此选项。
使用给定的
parent
构造一个抽象项模型。- beginInsertColumns(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
警告
本节包含自动从C++转换为Python的代码片段,可能包含错误。
开始列插入操作。
在子类中重新实现
insertColumns()
时,必须在向模型的基本数据存储中插入数据之前调用此函数。父索引
parent
对应于将新列插入其中的父元素;first
和last
是新列在插入后应有的列号。插入列
指定插入你想在模型元素中插入的列范围的首列和末列编号。
例如,如图所示,我们在第4列之前插入三列,所以
first
是4,last
是6。beginInsertColumns(parent, 4, 6)
这将三条新列插入为第4、5和6列。
追加列
要追加列,请将它们插入到最后一个列之后。
例如,如图所示,我们在现有六列(以第5列为末尾)的集合后追加三列,所以
first
是6,last
是8。beginInsertColumns(parent, 6, 8)
这将两条新列追加为第6、7和8列。
- beginInsertRows(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
警告
本节包含自动从C++转换为Python的代码片段,可能包含错误。
开始行插入操作。
在子类中重新实现
insertRows()
时,必须在将数据插入模型的基础数据存储之前调用此函数。parent
索引对应于新行要插入的父元素;first
和last
是新行插入后将具有的行号。插入行
指定插入你想在模型元素中插入的行范围的首行和末行编号。
例如,如图所示,我们在第2行之前插入三行,所以
first
是2,last
是4。beginInsertRows(parent, 2, 4)
这将三条新行插入为第2、3和4行。
追加行
要追加行,请将它们插入到最后一个行之后。
例如,如图所示,我们在现有四行(以第3行为末尾)的集合后追加两行,所以
first
是4,last
是5。beginInsertRows(parent, 4, 5)
这将两条新行追加为第4行和第5行。
- beginMoveColumns(sourceParent, sourceFirst, sourceLast, destinationParent, destinationColumn)#
- 参数:
sourceParent –
QModelIndex
sourceFirst – int
sourceLast – int
destinationParent –
QModelIndex
destinationColumn – int
- 返回类型:
bool
开始列移动操作。
当重写子类时,此方法简化了在模型中移动实体的操作。此方法负责移动模型中的持久索引,否则您将需要自己完成。使用 beginMoveColumns 和
endMoveColumns
是emitlayoutAboutToBeChanged
和layoutChanged
直接,同时对changePersistentIndex
的替代方案。sourceParent索引对应于从中移动列的父级;
sourceFirst
和sourceLast
是将被移动列的第一列和最后一列号。destinationParent索引对应于将此列移动到的父级。destinationChild是列要移动到的列。也就是说,sourceParent中列sourceFirst
的索引将变为destinationParent中列destinationChild
的索引,然后是所有其他列,直到sourceLast
。然而,当在同一父项下向下移动列时(
sourceParent
和destinationParent
相同),列将被放置在destinationChild
索引之前。也就是说,如果您希望将列 0 和 1 移动,使其成为列 1 和 2,那么destinationChild
应为 3。在这种情况下,源列i
(位于sourceFirst
和sourceLast
之间)的新索引等于(destinationChild-sourceLast-1+i)
。注意,如果
sourceParent
和destinationParent
相同,您必须确保destinationChild
不在sourceFirst
和sourceLast
+ 1 的范围内。您还必须确保不要尝试将列移动到其自身的子代或祖先。如果这两个条件中的任何一个为真,该方法返回false
,在这种情况下,您应该中止您的移动操作。另请参阅
- beginMoveRows(sourceParent, sourceFirst, sourceLast, destinationParent, destinationRow)#
- 参数:
sourceParent –
QModelIndex
sourceFirst – int
sourceLast – int
destinationParent –
QModelIndex
destinationRow – int
- 返回类型:
bool
警告
本节包含自动从C++转换为Python的代码片段,可能包含错误。
开始行移动操作。
在重新实现子类时,此方法简化了模型中实体的移动。该方法负责移动模型中的持久性索引,否则您将不得不自己执行这些操作。使用 beginMoveRows 和
endMoveRows
是直接发出layoutAboutToBeChanged
和layoutChanged
信号并与changePersistentIndex
结合的一种替代方法。代码
sourceParent
的索引对应于行移动的父项;sourceFirst
和sourceLast
是要移动的行的第一行和最后一行号。代码destinationParent
的索引对应于要移动这些行的父项。代码destinationChild
是要将行移动到的行。也就是说,在sourceParent
中的sourceFirst
行的索引将成为destinationParent
中的destinationChild
行的索引,随后是其他所有至上至sourceLast
的行。但是,当在同一父项内向下移动行时(
sourceParent
和destinationParent
相同),这些行将被放置在destinationChild
索引之前。也就是说,如果您想将0行和1行移动到它们成为1行和2行,那么destinationChild
应该是3。在这种情况下,源行i
的新索引(位于sourceFirst
和sourceLast
之间)等于(destinationChild-sourceLast-1+i)
。请注意,如果
sourceParent
和destinationParent
相同,您必须确保destinationChild
不在sourceFirst
和sourceLast
+ 1 的范围内。您还必须确保您不尝试将行移动到其自己的子项或祖先。如果满足这两种条件之一,此方法返回false
,在这种情况下,您应该中止您的移动操作。将行移动到另一个父项
在模型中指定您要在其中移动的源父项中要移动的行的第一行和最后一行号。也指定要将范围移动到目标父项中的行。
例如,如图所示,我们从源中移动2行到4行,因此
sourceFirst
为2,sourceLast
为4。我们将这些项目移动到目标中行2的上方,因此destinationChild
为2。beginMoveRows(sourceParent, 2, 4, destinationParent, 2)
这将从源中将三行行2、3和4移动到目的地,变为2、3和4。其他受影响的兄弟行相应地移位。
将行移动到另一个父项的附加中
要将行附加到另一个父项,请将它们移到最后一行之后。
例如,如图所示,我们将三行移到由6行组成的集合(以行5结束),因此
destinationChild
为6。beginMoveRows(sourceParent, 2, 4, destinationParent, 6)
这将从目标中将目标行移动到目标父项的末尾,为6、7和8。
在同一父项内向上移动行
为了在同一父项内移动行,指定要移动它们的行。
例如,如图所示,我们将第二行的一项移动到第0行,所以
sourceFirst
和sourceLast
分别是 2,而destinationChild
是 0。beginMoveRows(parent, 2, 2, parent, 0)
请注意,其他行可能相应地被移动。还请注意,当在同一父项内移动项时,不应尝试无效或无操作的移动。在上面的例子中,移动物品2移动之前位于第2行,因此不能将其移动到第2行(其已存在的地方)或第3行(无操作,因为第3行表示在第3行之上,它本身已经是第3行)。
在同一父项中向下移动行
为了在同一父项内移动行,指定要移动它们的行。
例如,如图所示,我们将第二行的一项目标到第四行,所以
sourceFirst
和sourceLast
分别是 2,而destinationChild
是 4。beginMoveRows(parent, 2, 2, parent, 4)
请注意,其他行可能相应地被移动。
另请参阅
- beginRemoveColumns(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
警告
本节包含自动从C++转换为Python的代码片段,可能包含错误。
开始进行列删除操作。
在派生类中 reimplementing
removeColumns()
之前,您必须首先调用此函数。parent
指数对应于将要从中删除新列的父级;first
和last
分别是要删除的第一列和最后一列的列号。删除列
指定从模型中的项中删除的一组列的第一个和最后一个列号。
例如,如图所示,我们从第4列到第6列删除了三列,所以
first
是 4,而last
是 6。beginRemoveColumns(parent, 4, 6)
- beginRemoveRows(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
警告
本节包含自动从C++转换为Python的代码片段,可能包含错误。
开始进行行删除操作。
在派生类中 reimplementing
removeRows()
之前,您必须首先调用此函数。parent
指数对应于将要从中删除新行的父级;first
和last
分别是要删除的第一行和最后一行的行号。删除行
指定模型中要删除行的起始和结束行号。
例如,如图所示,我们删除了第2行到第3行的两行,因此
first
为2,last
为3beginRemoveRows(parent, 2, 3)
- beginResetModel()#
开始模型重置操作。
重置操作将模型重置到其当前状态中的任何附加视图。
注意
附加到此模型的所有视图也将重置。
当模型重置时,这意味着模型报告的任何先前数据现在都是无效的,并且必须再次查询。这也意味着当前项目以及任何选定的项目将变得无效。
当模型的数据发生根本变化时,有时只需调用此函数而不是发出
dataChanged()
以通知其他组件底层数据源或其结构已更改,这可能更容易。在您的模型或代理模型中重置任何内部数据结构之前,您必须调用此函数。
此函数产生信号
modelAboutToBeReset()
.- buddy(index)#
- 参数:
index –
QModelIndex
- 返回类型:
返回由
index
表示的项目伙伴的模型索引。当用户想要编辑一个项目时,视图将调用此函数来检查是否应该编辑模型中的另一个项目。然后,视图将使用由图书伙伴项目返回的模型索引构建一个代理。此函数的默认实现使每个项目都是其自己的伙伴。
- canDropMimeData(data, action, row, column, parent)#
- 参数:
data –
QMimeData
操作 –
DropAction
行 – int
列 – int
parent –
QModelIndex
- 返回类型:
bool
如果模型可以接受
data
的拖放操作,则返回true
。此默认实现仅检查data
是否至少在mimeTypes()
列表中有一个格式,以及action
是否在模型的supportedDropActions()
列表中。如果您想测试数据是否可以在
row
、column
、parent
位置以及action
下进行拖放,请在您的自定义模型中重写此函数。如果不需要这个测试,则不需要重写此函数。另请参阅
dropMimeData()
Using drag and drop with item views
- canFetchMore(parent)#
- 参数:
parent –
QModelIndex
- 返回类型:
bool
如果为
parent
提供了更多数据,则返回true
;否则返回false
。默认实现始终返回
false
。如果
canFetchMore()
返回true
,应该调用fetchMore()
函数。例如,这是 QAbstractItemView 的行为。另请参阅
- changePersistentIndex(from, to)#
- 参数:
from –
QModelIndex
to –
QModelIndex
将等于给定
from
模型索引的QPersistentModelIndex
改变为给定的to
模型索引。如果没有找到等于给定
from
模型索引的持久模型索引,则不进行任何更改。- changePersistentIndexList(from, to)#
- 参数:
from – QModelIndex 的列表
to – QModelIndex 的列表
将等于给定
from
模型索引列表的 {QPersistentModelIndex
} 转换为给定to
模型索引列表。如果在给定的
from
模型索引列表中没有找到等于的持久模型索引,则不做任何更改。- checkIndex(index[, options=QAbstractItemModel.CheckIndexOption.NoOption])#
- 参数:
index –
QModelIndex
options –
CheckIndexOption
的组合
- 返回类型:
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 而产生的错误非常有用。- clearItemData(index)#
- 参数:
index –
QModelIndex
- 返回类型:
bool
删除给定
index
存储的所有角色数据。如果成功,则返回true
;否则返回false
。如果成功删除了数据,则应发出dataChanged()
信号。基类实现返回false
- abstract columnCount([parent=QModelIndex()])#
- 参数:
parent –
QModelIndex
- 返回类型:
int
返回给定
parent
的子项列数。在大多数子类中,列数与
parent
无关。例如
int MyModel::columnCount(const QModelIndex &parent) const { Q_UNUSED(parent); return 3; }
- columnsAboutToBeInserted(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
此信号在列即将插入模型时发出。新项目将在
first
和last
之间(包含),位于给定的parent
项目下。注意
连接到此信号的组件使用它来适应模型维度变化。它只能由
QAbstractItemModel
的实现发出,不能在子类代码中显式发出。- columnsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationColumn)#
- 参数:
sourceParent –
QModelIndex
sourceStart – int
sourceEnd – int
destinationParent –
QModelIndex
destinationColumn – int
此信号在列即将在模型中移动时发出。将要移动的项目是位于
sourceStart
和sourceEnd
之间(包含),位于给定的sourceParent
项目下。它们将被移动到destinationParent
,从列destinationColumn
开始。- columnsAboutToBeRemoved(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
此信号在列即将从模型中删除时发出。要删除的项目是位于
first
和last
之间(包含),位于给定parent
项目下。注意
连接到此信号的组件使用它来适应模型维度变化。它只能由
QAbstractItemModel
的实现发出,不能在子类代码中显式发出。- columnsInserted(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
在将列插入到模型后,会产生此信号。新的项是指在给定
parent
项下,从first
到last
(包括)之间的项目。注意
连接到此信号的组件使用它来适应模型维度变化。它只能由
QAbstractItemModel
的实现发出,不能在子类代码中显式发出。- columnsMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationColumn)#
- 参数:
sourceParent –
QModelIndex
sourceStart – int
sourceEnd – int
destinationParent –
QModelIndex
destinationColumn – int
在模型内部移动列之后产生此信号。从
sourceStart
到sourceEnd
(包括)之间在指定的sourceParent
项下的项已被移动到destinationParent
,并从列号destinationColumn
开始。- columnsRemoved(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
从模型中删除列后产生此信号。删除的项目是给定
parent
项下,从first
到last
(包括)之间的项目。注意
连接到此信号的组件使用它来适应模型维度变化。它只能由
QAbstractItemModel
的实现发出,不能在子类代码中显式发出。- createIndex(row, column, ptr)#
- 参数:
行 – int
列 – int
ptr – 对象
- 返回类型:
为给定的行和列以及内部指针 ptr 创建模型索引。当使用 QSortFilterProxyModel 时,其索引有其自己的内部指针。不建议在模型之外访问此内部指针。请使用 data() 函数代替。此函数提供了一个模型子类必须使用的持久接口来创建模型索引。
警告
由于一些 Qt/Python 集成规则,ptr 参数在 QModelIndex 生命周期内不会增加引用。因此,在过程中必须保持 ptr 参数所使用的对象存活。如果您不确定这一点,不要销毁对象。
- createIndex(row, column[, id=0])
- 参数:
行 – int
列 – int
id –
quintptr
- 返回类型:
为指定的
row
和column
使用内部标识符id
创建模型索引。此函数提供了一种统一的接口,模型子类必须使用它来创建模型索引。
另请参阅
- 摘要 data(index[, role=Qt.DisplayRole])#
- 参数:
index –
QModelIndex
role - int
- 返回类型:
对象
返回由
index
指向的项在给定role
下存储的数据。- dataChanged(topLeft, bottomRight[, roles=list()])#
- 参数:
topLeft -
QModelIndex
bottomRight -
QModelIndex
roles - int 列表
每当现有项中的数据更改时都会发出此信号。
如果项具有相同的父级,则受影响的项是从
topLeft
到bottomRight
包含的项。如果项没有相同的父级,则行为未定义。在重写
setData()
函数时必须显式发出此信号。可选的
roles
参数可以用来指定哪些数据角色已被修改。如果 roles 参数为空向量,则表示应考虑所有角色已修改。roles 参数中元素的顺序没有任何意义。- decodeData(row, column, parent, stream)#
- 参数:
行 – int
列 – int
parent –
QModelIndex
stream -
QDataStream
- 返回类型:
bool
- dropMimeData(data, action, row, column, parent)#
- 参数:
data –
QMimeData
操作 –
DropAction
行 – int
列 – int
parent –
QModelIndex
- 返回类型:
bool
处理由给定
action
结束的拖放操作提供的data
。如果模型处理了数据和操作,则返回
true
;否则返回false
。指定的
row
、column
和parent
表示操作结束的位置在模型中的项。模型有责任在正确的位置完成操作。例如,在一个 QTreeView 中的项上进行的拖动操作可以导致新项作为由
row
、column
和parent
指定的项的子项插入,或者作为该项的兄弟项。当
row
和column
为 -1 时,表示应将放置的数据视为直接放置在parent
上。通常这意味着将数据作为parent
的子项追加。如果row
和column
大于或等于零,则表示在指定的parent
中的指定row
和column
处发生了放置。调用
mimeTypes()
成员来实现可接受的 MIME 类型的列表。此默认实现假定mimeTypes()
的默认实现,它返回单个默认 MIME 类型。如果您在您的自定义模型中重新实现了mimeTypes()
以返回多个 MIME 类型,则必须重新实现此函数以使用这些类型。另请参阅
supportedDropActions()
canDropMimeData()
使用项视图进行拖放和放置
- encodeData(indexes, stream)#
- 参数:
indexes – .QModelIndex 列表
stream -
QDataStream
- endInsertColumns()#
结束列插入操作。
在子类中重写
insertColumns()
函数时,您必须在将数据插入模型的基础数据存储后调用此函数。另请参阅
- endInsertRows()#
结束行插入操作。
在子类中重写
insertRows()
函数时,您必须在将数据插入模型的基础数据存储后调用此函数。另请参阅
- endMoveColumns()#
结束列移动操作。
在实现子类时,您必须在移动模型基础数据存储中的数据后调用此函数。
另请参阅
- endMoveRows()#
结束行移动操作。
在实现子类时,您必须在移动模型基础数据存储中的数据后调用此函数。
另请参阅
- endRemoveColumns()#
结束列删除操作。
在子类中重写
removeColumns()
函数时,您必须在从模型的基础数据存储中删除数据后调用此函数。另请参阅
- endRemoveRows()#
结束行删除操作。
在子类中重写
removeRows()
函数时,您必须在从模型的基础数据存储中删除数据后调用此函数。另请参阅
- endResetModel()#
完成模型重置操作。
您必须在对模型或代理模型中的任何内部数据结构进行重置后调用此函数。
此函数会发出信号
modelReset()
。另请参阅
- fetchMore(parent)#
- 参数:
parent –
QModelIndex
获取由父
parent
索引指定的项目的任何可用数据。如果您正在增量填充模型,则应重写此函数。
默认实现不执行任何操作。
另请参阅
- flags(index)#
- 参数:
index –
QModelIndex
- 返回类型:
ItemFlag
的组合
返回给定
index
的项目标志。基类实现返回的组合标志使项(
ItemIsEnabled
)可用,并允许选择该项(《ItemIsSelectable》)。另请参阅
项目标志
- hasChildren([parent=QModelIndex()])#
- 参数:
parent –
QModelIndex
- 返回类型:
bool
如果
parent
有任何子项,则返回true
;否则返回false
。使用父项上的
rowCount()
来找出子项的数量。请注意,如果在具有
ItemNeverHasChildren
标志的情况下报告特定索引的 hasChildren,则这种行为是未定义的。- hasIndex(row, column[, parent=QModelIndex()])#
- 参数:
行 – int
列 – int
parent –
QModelIndex
- 返回类型:
bool
如果模型为
row
和column
以及parent
返回一个有效的QModelIndex
,则返回true
;否则返回false
。- headerData(section, orientation[, role=Qt.DisplayRole])#
- 参数:
section – int
orientation –
Orientation
role - int
- 返回类型:
对象
返回给定
role
和section
在指定orientation
的表头中的数据。对于水平表头,节号对应列号。同样地,对于垂直表头,节号对应行号。
- headerDataChanged(orientation, first, last)#
- 参数:
orientation –
Orientation
first – int
last – int
每当头部发生变化时,都会发出此信号。
orientation
表示水平或垂直头部是否发生变化。需要更新从first
到last
的头部部分。在重新实现
setHeaderData()
函数时,必须显式发出此信号。如果您正在更改列数或行数,则不需要发出此信号,而是使用begin/end函数(请参阅
QAbstractItemModel
类描述中的子类章节以获取详细信息)。另请参阅
headerData()
setHeaderData()
dataChanged()
- 抽象 index(row, column[, parent=QModelIndex()])#
- 参数:
行 – int
列 – int
parent –
QModelIndex
- 返回类型:
返回由给定的
row
、column
和parent
索引指定的模型中项的索引。在子类中重新实现此函数时,调用
createIndex()
以生成模型索引,其他组件可以使用这些索引来引用模型中的项。另请参阅
- insertColumn(column[, parent=QModelIndex()])#
- 参数:
列 – int
parent –
QModelIndex
- 返回类型:
bool
在指定
parent
的子项中,在给定的column
之前插入一个单列。如果列已插入,则返回
true
;否则返回false
。另请参阅
insertColumns()
insertRow()
removeColumn()
- insertColumns(column, count[, parent=QModelIndex()])#
- 参数:
列 – int
count – 整数
parent –
QModelIndex
- 返回类型:
bool
对于支持此功能的数据模型,在指定的
column
前插入count
个新列。新列中的项目将是子项的表示,由parent
模型索引表示的项。如果
column
是 0,则将新列插入到现有列之前。如果
column
等于columnCount()
,则将新列附加到现有列之后。如果
parent
没有子项,则插入一行具有count
列。如果成功插入列,则返回
true
;否则返回false
。基类实现不执行任何操作并返回
false
。如果您实现了自己的模型,您可以根据需要重新实现此函数以支持插入操作。或者,您可以为更改数据提供自己的 API。
- insertRow(row[, parent=QModelIndex()])#
- 参数:
行 – int
parent –
QModelIndex
- 返回类型:
bool
在指定的
row
所指定的父项子项之前插入一行。注意
此函数调用虚方法
insertRows
。如果行成功插入,则返回
true
;否则返回false
。- insertRows(row, count[, parent=QModelIndex()])#
- 参数:
行 – int
count – 整数
parent –
QModelIndex
- 返回类型:
bool
注意
该函数的基本类实现不执行任何操作,并返回
false
。对于支持此功能的数据模型,在给定的
row
之前向模型中插入count
行。新行的项目将作为由parent
模型索引表示的项目子项。如果
row
是 0,则将这些行 prepend 到父项中任何现有行之前。如果
row
等于rowCount()
,则将这些行 append 到父项中任何现有行之后。如果
parent
没有子项,则插入一个由count
行组成的单一列。如果成功插入行,则返回
true
;否则返回false
。如果您实现了自己的模型,则可以根据需要重新实现此函数以支持插入。或者,您可以提供更改数据的自己的 API。在任何情况下,您都需要调用
beginInsertRows()
和endInsertRows()
来通知其他组件模型已更改。- itemData(index)#
- 参数:
index –
QModelIndex
- 返回类型:
类型为 int 的键和类型为 QVariant 的值的字典。
返回一个映射,其中包含给定
index
处的项目的所有预定义角色的值。如果您想扩展此函数的默认行为,以包含映射中的自定义角色,则应重新实现此函数。
- layoutAboutToBeChanged([parents=list()[, hint=QAbstractItemModel.NoLayoutChangeHint]])#
- 参数:
parents – .list of QPersistentModelIndex
hint –
LayoutChangeHint
这个信号在模型布局即将改变之前发出。连接到该信号的组件可以使用它来适应模型布局的变化。
子类应该在发出 layoutAboutToBeChanged() 之后更新任何持久模型索引。
可选的
parents
参数用于提供有关模型布局中哪些部分正在更改的更具体的通知。空列表表示整个模型布局的改变。列表中元素的顺序不重要。可选的hint
参数用于在模型重排期间提供提示。- layoutChanged([parents=list()[, hint=QAbstractItemModel.NoLayoutChangeHint]])#
- 参数:
parents – .list of QPersistentModelIndex
hint –
LayoutChangeHint
这个信号会在模型暴露的项的布局发生变化时发出;例如,当模型已排序时。当视图接收到该信号时,应更新项的布局以反映这种变化。
在子类化
QAbstractItemModel
或QAbstractProxyModel
时,确保在更改项的顺序或更改向视图公开的数据的结构之前发出layoutAboutToBeChanged()
,并且在布局变更后发出 layoutChanged()。可选的
parents
参数用于提供有关模型布局中哪些部分正在更改的更具体的通知。空列表表示整个模型布局的改变。列表中元素的顺序不重要。可选的hint
参数用于在模型重排期间提供提示。子类应该在发出 layoutChanged() 之前更新任何持久模型索引。换句话说,当结构发生变化时
记住将要改变的
QModelIndex
更新您的内部数据
发出 layoutChanged
- match(start, role, value[, hits=1[, flags=Qt.MatchFlags(Qt.MatchStartsWith|Qt.MatchWrap)]])#
- 参数:
start –
QModelIndex
role - int
value – 对象
hits – 整数
flags –
MatchFlag
的组合
- 返回类型:
. QModelIndex 列表
返回一个列表,包含与在
start
指索引列中的数据存储的数据项在给定的role
下匹配指定的value
的QModelIndex
。搜索方式由给定的flags
定义。返回的列表可能为空。请注意,如果使用代理模型,列表中结果的顺序可能与模型中的顺序不对应,因此结果的顺序不可靠。搜索从
start
指索引开始,直到匹配的数据项数量等于hits
、搜索达到最后一行或搜索再次到达start
,具体取决于是否在flags
中指定了MatchWrap
。如果您想搜索所有匹配项,请使用hits
= -1。默认情况下,此函数将对所有项执行基于文本的环绕比较,搜索以
value
指定的搜索词开头的项。注意
此函数的默认实现仅搜索列。重新实现此函数以包括不同的搜索行为。
返回一个包含对应于指定的
indexes
列表的数据项序列化对象的函数。用于描述编码数据的格式是从mimeTypes()
函数获得的。默认实现使用mimeTypes()
的默认实现返回的默认 MIME 类型。如果在你自定义的模型中重写mimeTypes()
以返回更多的 MIME 类型,则需要重写此函数以使用它们。如果
indexes
列表为空,或者没有支持的 MIME 类型,则返回None
而不是序列化的空列表。- mimeTypes()#
- 返回类型:
字符串列表
返回允许的 MIME 类型列表。默认情况下,内置的模型和视图使用一个内部 MIME 类型:
application/x-qabstractitemmodeldatalist
。在自定义模型中实现拖放支持时,如果您将以除了默认内部 MIME 类型之外的其他格式返回数据,则需要重写此函数以返回您的 MIME 类型列表。
如果您在自定义模型中重写此函数,还必须重写调用它的成员函数:
mimeData()
和dropMimeData()
。另请参阅
- modelAboutToBeReset()#
当调用
beginResetModel()
时,在模型内部状态(例如持久性模型索引)被无效化之前,会发出此信号。- modelReset()#
当调用
endResetModel()
方法后,模型内部状态(例如持久化模型索引)被无效化时,会发出此信号。请注意,如果模型被重置,则应考虑之前从中检索到的所有信息都是无效的。这包括但不限于
rowCount()
和columnCount()
,flags()
,通过data()
获取的数据,以及roleNames()
。- moveColumn(sourceParent, sourceColumn, destinationParent, destinationChild)#
- 参数:
sourceParent –
QModelIndex
sourceColumn – int
destinationParent –
QModelIndex
destinationChild – int
- 返回类型:
bool
在支持此功能的模型上,将
sourceColumn
从sourceParent
移动到destinationChild
下的destinationParent
。如果列成功移动,则返回
true
;否则返回false
。另请参阅
- moveColumns(sourceParent, sourceColumn, count, destinationParent, destinationChild)#
- 参数:
sourceParent –
QModelIndex
sourceColumn – int
count – 整数
destinationParent –
QModelIndex
destinationChild – int
- 返回类型:
bool
在支持此功能的模型上,将起始于给定
sourceColumn
的count
列从父项sourceParent
下移动到父项destinationParent
的destinationChild
下的列。如果列成功移动,则返回
true
;否则返回false
。基类实现不执行任何操作并返回
false
。如果您实现了自己的模型,您可以根据需要支持移动来重写此函数。或者,您可以提供自己的API来更改数据。
- moveRow(sourceParent, sourceRow, destinationParent, destinationChild)#
- 参数:
sourceParent –
QModelIndex
sourceRow – int
destinationParent –
QModelIndex
destinationChild – int
- 返回类型:
bool
在支持该功能的模型上,将
sourceRow
从sourceParent
移动到destinationChild
下的destinationParent
。如果行成功移动,则返回
true
;否则返回false
。另请参阅
- moveRows(sourceParent, sourceRow, count, destinationParent, destinationChild)#
- 参数:
sourceParent –
QModelIndex
sourceRow – int
count – 整数
destinationParent –
QModelIndex
destinationChild – int
- 返回类型:
bool
在支持此功能的模型中,将起始
sourceRow
的count
行从父sourceParent
移动到父destinationParent
下的destinationChild
。如果行成功移动,则返回
true
;否则返回false
。基类实现不执行任何操作并返回
false
。如果您实现了自己的模型,您可以根据需要支持移动来重写此函数。或者,您可以提供自己的API来更改数据。
- 抽象parent(child)#
- 参数:
child –
QModelIndex
- 返回类型:
返回具有给定
index
的模型项的父项。如果项没有父项,则返回一个无效的QModelIndex
。在公开树数据结构的模型中,常见的约定是,只有第一列的项有子项。对于这种情况下,在子类中重新实现此函数时,返回的
QModelIndex
的列将会是 0。在子类中重新实现此函数时,请注意避免调用像是
QModelIndex
成员函数,例如parent()
,因为这些属于你的模型,将简单调用你的实现,导致无限递归。另请参阅
- persistentIndexList()#
- 返回类型:
. QModelIndex 列表
返回存储在模型中的持久索引列表。
- removeColumn(column[, parent=QModelIndex()])#
- 参数:
列 – int
parent –
QModelIndex
- 返回类型:
bool
从父项指定的
parent
子项中删除指定的column
。如果删除列则返回
true
,否则返回false
。- removeColumns(column, count[, parent=QModelIndex()])#
- 参数:
列 – int
count – 整数
parent –
QModelIndex
- 返回类型:
bool
支持此功能的模型上,从指定在父项
parent
下以给定column
开始的count
列从模型中删除。如果列成功删除则返回
true
,否则返回false
。基类实现不执行任何操作并返回
false
。如果你实现了自己的模型,你可以重新实现此函数以支持删除。或者,你也可以提供一个用于修改数据的自定义 API。
- removeRow(row[, parent=QModelIndex()])#
- 参数:
行 – int
parent –
QModelIndex
- 返回类型:
bool
从指定的
parent
指定的子项中移除给定的row
。如果行已被移除,则返回
true
;否则返回false
。这是一个方便的函数,它调用
removeRows()
。在QAbstractItemModel
的removeRows()
实现中,什么都不做。- removeRows(row, count[, parent=QModelIndex()])#
- 参数:
行 – int
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,()
- revert()#
通知模型应该丢弃缓存的信息。此函数通常用于行编辑。
另请参阅
- roleNames()#
- 返回类型:
键为.int类型,值为.QByteArray类型的字典。
返回模型的角色名称。
Qt设置默认角色名称如下:
Qt 角色
QML 角色名称
显示
装饰
编辑
工具提示
状态提示
这是什么
- abstract rowCount([parent=QModelIndex()])#
- 参数:
parent –
QModelIndex
- 返回类型:
int
返回给定
parent
下的行数。当parent有效时,意味着rowCount返回的是parent的子项数量。- rowsAboutToBeInserted(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
在将行插入模型之前发出此信号。新项目将被放置在
start
和end
之间(包括端点),在给定的parent
项下。注意
连接到此信号的组件使用它来适应模型维度变化。它只能由
QAbstractItemModel
的实现发出,不能在子类代码中显式发出。- rowsAboutToBeMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationRow)#
- 参数:
sourceParent –
QModelIndex
sourceStart – int
sourceEnd – int
destinationParent –
QModelIndex
destinationRow – int
在模型内部移动行之前发出此信号。将要移动的项目是那些在
sourceStart
和sourceEnd
之间(包括端点),在给定的sourceParent
项下。它们将被移动到destinationParent
,从行destinationRow
开始移动。- rowsAboutToBeRemoved(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
此信号在从模型中删除行之前发出。将被删除的项目是在给定
parent
项下,从first
到last
(包含两端)范围内的项目。注意
连接到此信号的组件使用它来适应模型维度变化。它只能由
QAbstractItemModel
的实现发出,不能在子类代码中显式发出。- rowsInserted(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
此信号在将行插入模型之后发出。新项是在给定
parent
项下,从first
到last
(包含两端)范围内的项目。注意
连接到此信号的组件使用它来适应模型维度变化。它只能由
QAbstractItemModel
的实现发出,不能在子类代码中显式发出。- rowsMoved(sourceParent, sourceStart, sourceEnd, destinationParent, destinationRow)#
- 参数:
sourceParent –
QModelIndex
sourceStart – int
sourceEnd – int
destinationParent –
QModelIndex
destinationRow – int
此信号在模型内移动行之后发出。从
sourceStart
到sourceEnd
(包含两端)范围内的项目,在给定sourceParent
项下,已移动到destinationParent
,并从行号destinationRow
开始。- rowsRemoved(parent, first, last)#
- 参数:
parent –
QModelIndex
first – int
last – int
此信号在从模型中删除行之后发出。被删除的项目是在给定
parent
项下,从first
到last
(包含两端)范围内的项目。注意
连接到此信号的组件使用它来适应模型维度变化。它只能由
QAbstractItemModel
的实现发出,不能在子类代码中显式发出。- setData(index, value[, role=Qt.EditRole])#
- 参数:
index –
QModelIndex
value – 对象
role - int
- 返回类型:
bool
将索引为
index
的项的role
数据设置为value
。若成功则返回
true
;否则返回false
。如果数据被成功设置,应发射
dataChanged()
信号。基本类实现返回
false
。对于可编辑模型,必须重新实现此函数和data()
函数。另请参阅
- setHeaderData(section, orientation, value[, role=Qt.EditRole])#
- 参数:
section – int
orientation –
Orientation
value – 对象
role - int
- 返回类型:
bool
将给定
role
和section
的头部数据设置为指定的orientation
的value
值。如果更新了头部的数据,则返回
true
;否则返回false
。在重新实现此函数时,必须显式发射
headerDataChanged()
信号。另请参阅
- setItemData(index, roles)#
- 参数:
index –
QModelIndex
roles – 类型为 .int 的键和类型为 QVariant 的值的字典。
- 返回类型:
bool
将
index
处项目的作用域数据设置为roles
中关联的值,适用于每个ItemDataRole
。若成功则返回
true
;否则返回false
。不在
roles
中的作用域将不会被修改。另请参阅
- sibling(row, column, idx)#
- 参数:
行 – int
列 – int
idx –
QModelIndex
- 返回类型:
返回位于
index
的项在row
和column
位置的兄弟项,如果没有该位置的兄弟项,则返回一个无效的QModelIndex
。sibling() 是一个方便函数,用于找到项的父项,并使用它来检索指定
row
和column
下的子项索引。此方法可以针对特定的优化进行覆盖。
按给定的
order
对模型按column
排序。基类实现不执行任何操作。
- span(index)#
- 参数:
index –
QModelIndex
- 返回类型:
返回由
index
表示的项的行和列跨度。注意
目前,未使用span。
- submit()#
- 返回类型:
bool
让模型知道它应该将缓存的信息提交到永久存储。此函数通常用于行编辑。
如果没有错误,返回
true
;否则返回false
。另请参阅
- supportedDragActions()#
- 返回类型:
DropAction
的组合
返回本模型数据所支持的操作。
默认实现返回
supportedDropActions()
。如果您想支持额外的操作,则需重写此函数。supportedDragActions
用于在拖动发生时作为QAbstractItemView
的startDrag()
的默认值。另请参阅
DropActions
使用drag
和drop
在item
views
- supportedDropActions()#
- 返回类型:
DropAction
的组合
返回此模型支持的下拽操作。
默认实现返回
CopyAction
。如果您想支持额外的操作,则需重写此函数。同时您还需要重写dropMimeData()
函数以处理额外的操作。另请参阅
dropMimeData()
下拽操作