天天看點

Qt模型視圖架構:QAbstractItemModel

一、概述

QAbstractItemModel 類定義了項目模型必須使用的标準接口,以便能夠與模型/視圖架構中的其他元件進行互操作。 正确用法是将其子類化以建立新模型。

此類用作 QML 中的項目視圖元素或 Qt Widgets 子產品中的項目視圖類的底層資料模型。

如果需要一個模型與項目視圖一起使用,例如 QML 的清單視圖元素或 C++ 小部件 QListView 或 QTableView,則應該考慮子類化 QAbstractListModel 或 QAbstractTableModel 而不是此類。

底層資料模型作為表的層次結構向視圖和委托公開。 如果不使用層次結構,那麼模型就是一個簡單的行和清單。

每個項目都有一個由 QModelIndex 指定的唯一索引。

Qt模型視圖架構:QAbstractItemModel

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);
           
Qt模型視圖架構:QAbstractItemModel
beginInsertColumns(parent, 6, 8);
           
Qt模型視圖架構:QAbstractItemModel

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

開始行插入操作。

在子類中重新實作 insertRows() 時,必須在将資料插入模型的底層資料存儲之前調用此函數。

parent 對應于插入新行的父索引,first 和 last 是新行插入後的行号。

注意:此函數發出rowsAboutToBeInserted() 信号,連接配接的視圖(或代理)在插入資料之前必須處理該信号。 否則,視圖可能最終處于無效狀态。

beginInsertRows(parent, 2, 4);
           
Qt模型視圖架構:QAbstractItemModel
beginInsertRows(parent, 4, 5);
           
Qt模型視圖架構:QAbstractItemModel

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);
           
Qt模型視圖架構:QAbstractItemModel
beginMoveRows(sourceParent, 2, 4, destinationParent, 6);
           
Qt模型視圖架構:QAbstractItemModel
beginMoveRows(parent, 2, 2, parent, 0);
           
Qt模型視圖架構:QAbstractItemModel
beginMoveRows(parent, 2, 2, parent, 4);
           
Qt模型視圖架構:QAbstractItemModel

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

開始列移除操作。

在子類中重新實作 removeColumns() 時,必須在從模型的底層資料存儲中删除資料之前調用此函數。

parent 對應于從中删除新列的父索引,first 和 last 是要删除的第一列和最後一列的列号。

注意:此函數發出 columnsAboutToBeRemoved() 信号,連接配接的視圖(或代理)在删除資料之前必須處理該信号。 否則,視圖可能最終處于無效狀态。

beginRemoveColumns(parent, 4, 6);
           
Qt模型視圖架構:QAbstractItemModel

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

開始行删除操作。

在子類中重新實作 removeRows() 時,必須在從模型的底層資料存儲中删除資料之前調用此函數。

parent對應于從中删除新行的父索引,first 和 last 是要删除的行的行号。

注意:此函數發出rowsAboutToBeRemoved() 信号,連接配接的視圖(或代理)在删除資料之前必須處理該信号。 否則,視圖可能最終處于無效狀态。

beginRemoveRows(parent, 2, 3);
           
Qt模型視圖架構:QAbstractItemModel

 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() 函數來處理附加操作。