Qt模型视图框架:QAbstractItemModel

一、概述

QAbstractItemModel 类定义了项目模型必须使用的标准接口,以便能够与模型/视图框架中的其他组件进行互操作。 正确用法是将其子类化以创建新模型。

此类用作 QML 中的项目视图元素或 Qt Widgets 模块中的项目视图类的底层数据模型。

如果需要一个模型与项目视图一起使用,例如 QML 的列表视图元素或 C++ 小部件 QListView 或 QTableView,则应该考虑子类化 QAbstractListModel 或 QAbstractTableModel 而不是此类。

底层数据模型作为表的层次结构向视图和委托公开。 如果不使用层次结构,那么模型就是一个简单的行和列表。

每个项目都有一个由 QModelIndex 指定的唯一索引。

1.1、子类化

在继承 QAbstractItemModel 时,至少必须实现:

  • index()
  • parent()
  • rowCount()
  • columnCount()
  • data()

这些函数用于所有只读模型,并构成可编辑模型的基础。

要在模型中启用编辑,还必须实现:

  • setData()
  • flags()(要确保返回 ItemIsEditable

控制模型标题的显示方式,可以实现:

  • headerData()
  • setHeaderData()

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


二、成员类型

1、enum class QAbstractItemModel::CheckIndexOption:此枚举可用于控制由 checkIndex() (此函数检查 index 是否是该模型的合法模型索引)执行的检查。

  • NoOption:未指定选项。
  • IndexIsValid:传递给 checkIndex() 的模型索引被检查为有效的模型索引。
  • DoNotUseParent:不执行任何涉及传递给 checkIndex() 的索引的父项的使用的检查。
  • ParentIsInvalid:传递给checkIndex()的模型索引的父级被检查为无效的模型索引。如果同时指定了此选项和 DoNotUseParent,则忽略此选项。

2、enum QAbstractItemModel::LayoutChangeHint:此枚举描述模型更改布局的方式。

  • NoLayoutChangeHint:无。
  • VerticalSortHint:Rows 正在排序。
  • HorizontalSortHint:Columns 正在排序。

三、成员函数

3.1、私有信号

私有信号只能由 QAbstractItemModel 实现发出,不能在子类代码中显式发出。

私有信号可以用于信号连接,但不能由用户发射。

1、[私有] void columnsAboutToBeInserted(const QModelIndex &parent, int first, int last)

该信号在列插入模型之前发出。新项目将位于给定parent下的first和last之间。

连接到此信号的组件使用它来适应模型尺寸的变化。

2、[私有] void columnsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationColumn)

该信号在列在模型内移动之前发出。将被移动的项目是在给定的 sourceParent 项目下的 sourceStart 和 sourceEnd 之间的项目。 它们将被移动到destinationParent,从destinationColumn 列开始。

连接到此信号的组件使用它来适应模型尺寸的变化。

3、[私有] void columnsAboutToBeRemoved(const QModelIndex &parent, int first, int last)

该信号在列从模型中移除之前发出。要删除的项目是在给定 parent 下的 first 和 last 之间的项目。

连接到此信号的组件使用它来适应模型尺寸的变化。

4、[私有] void columnsInserted(const QModelIndex &parent, int first, int last)

在将列插入模型之后发出此信号。新项目是在给定parent下的first和last之间的项目。

连接到此信号的组件使用它来适应模型尺寸的变化。

5、[私有] void columnsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int column)

在模型内移动列之后发出此信号。给parent下的 start 和 end 之间的项目已移至 column 列开始的destination。

连接到此信号的组件使用它来适应模型尺寸的变化。

6、[私有] void columnsRemoved(const QModelIndex &parent, int first, int last)

从模型中删除列后会发出此信号。 删除的项目是在给parent下的first和last之间的项目。

连接到此信号的组件使用它来适应模型尺寸的变化。

7、[私有] void modelAboutToBeReset()

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

8、[私有] void modelReset()

在模型的内部状态(例如,持久模型索引)失效后,调用 endResetModel() 时会发出此信号。

9、[私有] void rowsAboutToBeInserted(const QModelIndex &parent, int start, int end)

该信号在行插入模型之前发出。新项目在给定的parent下将被定位在start和end之间。

连接到此信号的组件使用它来适应模型尺寸的变化。

10、[私有] void rowsAboutToBeMoved(const QModelIndex &sourceParent, int sourceStart, int sourceEnd, const QModelIndex &destinationParent, int destinationRow)

该信号在行在模型内移动之前发出。将被移动的项目是在给定的 sourceParent 项目下的 sourceStart 和 sourceEnd 之间的项目。 它们将被移动到destinationParent 行,从destinationRow 开始。

连接到此信号的组件使用它来适应模型尺寸的变化。

11、[私有] void rowsAboutToBeRemoved(const QModelIndex &parent, int first, int last)

该信号在行从模型中移除之前发出。 将被删除的项目是在给定parent下的first和last之间的项目。

连接到此信号的组件使用它来适应模型尺寸的变化。

12、[私有] void rowsInserted(const QModelIndex &parent, int first, int last)

在将行插入模型后发出此信号。新项目是在给定parent下的first和last之间的项目。

连接到此信号的组件使用它来适应模型尺寸的变化。

13、[私有] void rowsMoved(const QModelIndex &parent, int start, int end, const QModelIndex &destination, int row)

模型内移动行后发出此信号。 给定parent下的 start 和 end 之间的项已移动到从row行开始的destination。

连接到此信号的组件使用它来适应模型尺寸的变化。

14、[私有] void rowsRemoved(const QModelIndex &parent, int first, int last)

模型中删除行后会发出此信号。删除的项目是在给定parent下的first和last之间的项目。

连接到此信号的组件使用它来适应模型尺寸的变化。

3.2、非私有信号

1、void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QList<int> &roles = QList<int>())

只要现有项目中的数据发生变化,就会发出此信号。

如果项目属于同一父项,则受影响的项目是 topLeft 和 bottomRight 之间的项目。如果项目没有相同的父项,则行为未定义。
重新实现 setData() 函数时,必须显式发出此信号。

roles 可用于指定实际修改了哪些数据角色。roles 中元素的顺序没有任何相关性。

2、void headerDataChanged(Qt::Orientation orientation, int first, int last)

每当更改标题时都会发出此信号。orientation指示水平或垂直标题是否已更改。标题中从first到last的部分需要更新。

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

如果要更改列数或行数,则不需要发出此信号。

3、void layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)

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

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

parent 参数用于提供有关模型布局的哪些部分正在更改的更具体的通知,空列表表示整个模型的布局发生了变化。列表中元素的顺序并不重要。hint 参数用于提示模型重新布局时发生的情况。

4、void layoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint)

每当模型公开的项目布局发生变化时,就会发出此信号(例如,当模型已经排序)。当视图收到此信号时,它应更新项目的布局以反映此更改。

在继承 QAbstractItemModel 或 QAbstractProxyModel 时,请确保在更改项目顺序或更改向视图公开的数据结构之前发出 layoutAboutToBeChanged(),并在更改布局后发出 layoutChanged()。

parent 参数用于提供有关模型布局的哪些部分正在更改的更具体的通知,空列表表示整个模型的布局发生了变化。列表中元素的顺序并不重要。hint 参数用于提示模型重新布局时发生的情况。

子类应该在发出 layoutChanged() 之前更新持久模型索引。

当结构发生变化时:

  • 发出 layoutAboutToBeChanged()
  • 记住会改变的 QModelIndex
  • 更新内部数据
  • 调用 changePersistentIndex()
  • 发出布局已更改

3.3、函数

1、void resetInternalData()

在模型的内部数据被清除后,当它正在被重置时会被调用。

2、void revert()

让模型知道它应该丢弃缓存的信息。此功能通常用于行编辑。

3、bool submit()

让模型知道它应该将缓存的信息提交到永久存储。 此功能通常用于行编辑。如果没有错误则返回true.

4、void beginInsertColumns(const QModelIndex &parent, int first, int last)

开始列插入操作。

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

parent 对应于插入新列的父索引,first 和 last 是新列插入后的列号。

注意:此函数会发出 columnsAboutToBeInserted() 信号,连接的视图(或代理)在插入数据之前必须处理该信号。 否则视图可能最终处于无效状态。

beginInsertColumns(parent, 4, 6);

beginInsertColumns(parent, 6, 8);

 

5、void beginInsertRows(const QModelIndex &parent, int first, int last)

开始行插入操作。

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

parent 对应于插入新行的父索引,first 和 last 是新行插入后的行号。

注意:此函数发出rowsAboutToBeInserted() 信号,连接的视图(或代理)在插入数据之前必须处理该信号。 否则,视图可能最终处于无效状态。

beginInsertRows(parent, 2, 4);

 beginInsertRows(parent, 4, 5);

6、bool beginMoveColumns(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild)

开始列移动操作。

重新实现子类时,此方法简化了模型中移动实体的过程。使用 beginMoveColumns() 和 endMoveColumns() 是直接与 changePersistentIndex() 一起发出 layoutAboutToBeChanged() 和 layoutChanged() 的​​替代方法。

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,在这种情况下,应该中止移动操作。

7、bool beginMoveRows(const QModelIndex &sourceParent, int sourceFirst, int sourceLast, const QModelIndex &destinationParent, int destinationChild)

开始行移动操作。与上面类似。

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

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

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

 

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

8、void beginRemoveColumns(const QModelIndex &parent, int first, int last)

开始列移除操作。

在子类中重新实现 removeColumns() 时,必须在从模型的底层数据存储中删除数据之前调用此函数。

parent 对应于从中删除新列的父索引,first 和 last 是要删除的第一列和最后一列的列号。

注意:此函数发出 columnsAboutToBeRemoved() 信号,连接的视图(或代理)在删除数据之前必须处理该信号。 否则,视图可能最终处于无效状态。

beginRemoveColumns(parent, 4, 6);

 

9、void beginRemoveRows(const QModelIndex &parent, int first, int last)

开始行删除操作。

在子类中重新实现 removeRows() 时,必须在从模型的底层数据存储中删除数据之前调用此函数。

parent对应于从中删除新行的父索引,first 和 last 是要删除的行的行号。

注意:此函数发出rowsAboutToBeRemoved() 信号,连接的视图(或代理)在删除数据之前必须处理该信号。 否则,视图可能最终处于无效状态。

beginRemoveRows(parent, 2, 3);

 10、void beginResetModel()

开始模型重置操作。附加到此模型的任何视图也将被重置。

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

此函数会发出信号 modelAboutToBeReset()。

11、QModelIndex buddy(const QModelIndex &index)

返回由index表示的项目的好友模型索引。

当用户想要编辑一个项目时,视图会调用这个函数来检查模型中的另一个项目是否应该被编辑。 然后,视图将使用伙伴项返回的模型索引构造一个委托。

12、bool canDropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)

如果模型可以接受拖拽数据,则返回 true。 

13、[invokable] bool canFetchMore(const QModelIndex &parent)

如果父级有更多可用数据,则返回 true。默认实现始终返回 false。

如果 canFetchMore() 返回 true,则应调用 fetchMore() 函数。

这个函数可以通过元对象系统和 QML 调用。

14、bool checkIndex(const QModelIndex &index, QAbstractItemModel::CheckIndexOptions options = CheckIndexOption::NoOption)

此函数检查 index 是否是该模型的合法模型索引。

合法的模型索引要么是无效的模型索引,要么是满足以下所有条件的有效模型索引:

  • 索引模型是this
  • 索引的行大于或等于零
  • 索引的行小于索引父级的行数
  • 索引的列大于或等于零
  • 索引的列小于索引的父级的列数

options 参数设置检查选项。

  • 如果 options 包含 IndexIsValid,则 index 必须是有效索引。
  • 如果 options 包含 DoNotUseParent,则省略调用 parent() 的检查。这允许从 parent() 重新实现中调用此函数(否则,这将导致无限递归和崩溃)。
  • 如果 options 不包含 DoNotUseParent,并且包含 ParentIsInvalid,则执行附加检查,检查父索引是否无效。

15、bool clearItemData(const QModelIndex &index)

删除存储在给定索引的所有角色中的数据。成功则返回true。如果成功删除数据,则应发出 dataChanged() 信号。

16、[invokable] int columnCount(const QModelIndex &parent = QModelIndex())

返回给定父级的子级的列数。在大多数子类中,列数与父类无关。

这个函数可以通过元对象系统和 QML 调用。

17、QModelIndex createIndex(int row, int column, const void *ptr = nullptr)

使用内部指针 ptr 为给定的行和列创建模型索引。

当使用 QSortFilterProxyModel 时,它的索引有自己的内部指针。不建议在模型之外访问这个内部指针。请改用 data() 函数。

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

18、[invokable] QVariant data(const QModelIndex &index, int role = Qt::DisplayRole)

返回存储在给定角色下的数据,用于索引引用的项目。

如果您没有要返回的值,请返回无效的 QVariant 而不是返回 0。

这个函数可以通过元对象系统和 QML 调用。

19、bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent)

处理拖放拖入的数据。

指定的行、列、父项指示模型中操作结束的项目的位置。在正确的位置完成动作是模型的责任。

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

20、void endInsertColumns()

结束列插入操作。在子类中重新实现 insertColumns() 时,必须在将数据插入模型的底层数据存储后调用此函数。

21、void endInsertRows()

结束行插入操作。在子类中重新实现 insertRows() 时,必须在将数据插入模型的底层数据存储后调用此函数。

22、void endMoveColumns() 

结束列移动操作。实现子类时,必须在模型的底层数据存储中移动数据后调用此函数。

23、void endMoveRows()

结束行移动操作。实现子类时,必须在模型的底层数据存储中移动数据后调用此函数。

24、void endRemoveColumns()

结束列移除操作。在子类中重新实现 removeColumns() 时,必须在从模型的底层数据存储中删除数据后调用此函数。

25、void endRemoveRows() 

结束行删除操作。在子类中重新实现 removeRows() 时,必须在从模型的底层数据存储中删除数据后调用此函数。

26、void endResetModel()

完成模型重置操作。必须在重置模型或代理模型中的任何内部数据结构后调用此函数。此函数会发出信号modelReset()。

27、[invokable] void fetchMore(const QModelIndex &parent)

获取具有由父索引指定的父项的项的任何可用数据。如果以增量方式填充模型,需要重新实现它。

默认实现什么都不做。这个函数可以通过元对象系统和 QML 调用。

28、[invokable] Qt::ItemFlags flags(const QModelIndex &index)

返回给定索引的项目标志。

基类实现返回启用项目 (ItemIsEnabled) 并允许选择项目 (ItemIsSelectable) 的标志组合。

这个函数可以通过元对象系统和 QML 调用。

29、[invokable] bool hasChildren(const QModelIndex &parent = QModelIndex())

parent 是否有子项。如果同一索引设置了标志 Qt::ItemNeverHasChildren,则调用此函数会产生未定义的行为。

这个函数可以通过元对象系统和 QML 调用。

30、[invokable] bool hasIndex(int row, int column, const QModelIndex &parent = QModelIndex())

如果模型为具有父级的行和列返回有效的 QModelIndex,则返回 true。

这个函数可以通过元对象系统和 QML 调用。

31、[invokable] QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole)

返回具有指定方向的标题中给定角色和部分的数据。对于水平标题,节号对应于列号。 同样,对于垂直标题,节号对应于行号。

这个函数可以通过元对象系统和 QML 调用。

32、[invokable] QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex())

返回由给定的行、列和父索引指定的模型中项目的索引。

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

这个函数可以通过元对象系统和 QML 调用。

33、bool insertColumn(int column, const QModelIndex &parent = QModelIndex())

在指定的父项的子项中的给定列之前插入单列。如果成功插入了列则返回 true。实际上是调用insertColumns()。

34、bool insertColumns(int column, int count, const QModelIndex &parent = QModelIndex()) 

在支持此功能的模型上,在给定列之前将计数新列插入模型中。每个新列中的项目将是由父模型索引表示的项目的子项。

35、bool insertRow(int row, const QModelIndex &parent = QModelIndex()) 

       bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex())

插入行,与上面类似。

36、QMap<int, QVariant> itemData(const QModelIndex &index)

返回一个map,其中包含index处的项目的模型中所有预定义角色的值。

37、[invokable] QModelIndexList match(const QModelIndex &start, int role, const QVariant &value, int hits = 1, Qt::MatchFlags flags = Qt::MatchFlags(Qt::MatchStartsWith|Qt::MatchWrap))

返回 start 索引列中项目的索引列表,其中存储在给定角色下的数据与 role 匹配。执行搜索的方式由 flags 定义。

列表中结果的顺序可能与模型中的顺序不一致。

默认情况下,此函数将对所有项目执行基于字符串的换行比较,搜索以 value 指定的搜索词开头的项目。

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

此函数可以通过元对象系统和 QML 调用。

enum Qt::MatchFlag:此枚举描述了在模型中搜索项目时可以使用的匹配类型。

  • Qt::MatchExactly:执行基于 QVariant 的匹配。
  • Qt::MatchFixedString:基于字符串的匹配。除非还指定了 MatchCaseSensitive 标志,否则基于字符串的比较不区分大小写。
  • Qt::MatchContains:搜索词包含在项目中。
  • Qt::MatchStartsWith:搜索词匹配项的开头。
  • Qt::MatchEndsWith:搜索词匹配项的结尾。
  • Qt::MatchCaseSensitive:搜索区分大小写。
  • Qt::MatchRegularExpression:使用正则表达式作为搜索词来执行基于字符串的匹配。
  • Qt::MatchWildcard:使用带有通配符的字符串作为搜索词来执行基于字符串的匹配。
  • Qt::MatchWrap:执行环绕搜索,这样当搜索到达模型中的最后一项时,它会再次从第一项开始,一直持续到检查完所有项为止。
  • Qt::MatchRecursive:搜索整个层次结构。

38、QMimeData * mimeData(const QModelIndexList &indexes)

返回一个对象,其中包含与指定索引列表相对应的序列化数据项。用于描述编码数据的格式是从 mimeTypes() 函数获得的。 此默认实现使用 mimeTypes() 的默认实现返回的默认 MIME 类型。

39、QStringList mimeTypes()

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

在自定义模型中实现拖放支持时,如果将以默认内部 MIME 类型以外的格式返回数据,请重新实现此函数以返回您的 MIME 类型列表。

在自定义模型中重新实现此函数,则还必须重新实现调用它的成员函数:mimeData() 和 dropMimeData()。

40、bool moveColumn(const QModelIndex &sourceParent, int sourceColumn, const QModelIndex &destinationParent, int destinationChild)

在支持此功能的模型上,将 sourceColumn 从 sourceParent 移动到 destinationParent 下的 destinationChild。

如果列成功移动则返回 true。

41、bool moveColumns(const QModelIndex &sourceParent, int sourceColumn, int count, const QModelIndex &destinationParent, int destinationChild)

在支持此功能的模型上,将从父 sourceParent 下的给定 sourceColumn 开始的列移动到父 destinationParent 下的列 destinationChild。

如果列成功移动则返回 true。

42、bool moveRow(const QModelIndex &sourceParent, int sourceRow, const QModelIndex &destinationParent, int destinationChild)

       bool moveRows(const QModelIndex &sourceParent, int sourceRow, int count, const QModelIndex &destinationParent, int destinationChild)

移动行。同上。

43、void multiData(const QModelIndex &index, QModelRoleDataSpan roleDataSpan)

使用给定索引的请求数据填充 roleDataSpan。

44、[invokable] QModelIndex parent(const QModelIndex &index)

返回具有给定索引的模型项的父项。 如果该项没有父项,则返回无效的 QModelIndex。

这个函数可以通过元对象系统和 QML 调用。

45、QModelIndexList persistentIndexList()

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

46、bool removeColumn(int column, const QModelIndex &parent = QModelIndex())

从指定的父项的子项中删除给定列。如果列被删除返回 true。实际上是调用removeColumns()。

 47、bool removeColumns(int column, int count, const QModelIndex &parent = QModelIndex())

在支持此功能的模型上,从模型中删除 parent 下的给定 column 开头的 count列。如果列被成功删除则返回 true。

48、bool removeRow(int row, const QModelIndex &parent = QModelIndex())

       bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex())

与上面类似,删除行。

49、QHash<int, QByteArray> roleNames()

返回模型的角色名称。

Qt 设置的默认角色名称是:

  • Qt::DisplayRole:display
  • Qt::DecorationRole:decoration
  • Qt::EditRole:edit
  • Qt::ToolTipRole:toolTip
  • Qt::StatusTipRole:statusTip
  • Qt::WhatsThisRole:whatsThis

50、[invokable] int rowCount(const QModelIndex &parent = QModelIndex())

返回给定父项下的行数。

这个函数可以通过元对象系统和 QML 调用。

51、[invokable] bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole)

设置索引处项目的角色数据。成功则返回true。如果成功设置了数据,则应发出 dataChanged() 信号。

此函数可以通过元对象系统和 QML 调用。

52、bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole)

设置标题的值。如果标题的数据已更新则返回 true。

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

53、bool setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles)

对于每个 Qt::ItemDataRole,将 index 处项目的角色数据设置为角色中的关联值。不在角色中的角色将不会被修改。

54、[invokable] QModelIndex sibling(int row, int column, const QModelIndex &index)

返回索引处项目的行和列的兄弟,如果该位置没有兄弟,则返回无效的 QModelIndex。

这个函数可以通过元对象系统和 QML 调用。

55、void sort(int column, Qt::SortOrder order = Qt::AscendingOrder)

按给定顺序按列对模型进行排序。

enum Qt::SortOrder:此枚举描述了widget中的项目是如何排序的。 

  • Qt::AscendingOrder:按升序排序,例如 在 Latin-1 语言环境中以 'AAA' 开头以 'ZZZ' 结尾
  • Qt::DescendingOrder:按降序排序,例如 在 Latin-1 语言环境中以“ZZZ”开头以“AAA”结尾

56、QSize span(const QModelIndex &index)

返回由索引表示的项目的行和列跨度。

57、Qt::DropActions supportedDragActions()

返回此模型中数据支持的操作。

58、Qt::DropActions supportedDropActions()

返回此模型支持的放置操作。

默认实现返回 Qt::CopyAction。如果希望支持其他操作,需重新实现此功能。还必须重新实现 dropMimeData() 函数来处理附加操作。

  • 23
    点赞
  • 118
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Qt模型-视图框架中,代理是作为模型视图之间的中介,负责将模型中的数据以特定的方式呈现到视图上。当模型中的数据发生变化时,代理也需要及时更新视图上对应的内容,这样用户才能看到最新的数据。 代理可以通过以下几个函数来实现与模型视图的联动响应: 1. Qt::ItemFlags QAbstractItemDelegate::flags(const QModelIndex &index) const 该函数返回指定索引处项目的标志,这些标志描述了项目是否可编辑、是否可以选择等信息。这些标志可以影响视图的行为,例如禁止编辑或禁止选择。 2. QWidget *QAbstractItemDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const 该函数在视图上创建一个用于编辑指定索引处项目的编辑器,并返回该编辑器的指针。代理需要对编辑器进行初始化,并将其与模型中的数据关联起来。 3. void QAbstractItemDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const 该函数将模型中指定索引处项目的数据加载到编辑器中,以便用户进行编辑。 4. void QAbstractItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const 该函数将编辑器中的数据保存到模型中指定索引处项目中。在这个函数中,代理需要将编辑器中的数据转换成模型中对应的数据类型,并将其保存起来。 5. QSize QAbstractItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const 该函数返回指定索引处项目的大小,以便视图可以正确的布局和显示项目。在这个函数中,代理需要根据项目的内容、字体、字号等因素计算出适当的大小。 通过实现上述函数,代理可以实现与模型视图的联动响应,并且能够实现自定义的数据显示、编辑和布局等功能。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值