日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于 QAbstractItemModel 学习的一点分享

發布時間:2025/3/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于 QAbstractItemModel 学习的一点分享 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 關于 QAbstractItemModel 學習的一點分享
    • 簡介:
    • 關于QAbstractItemModel類的細節描述:
    • 子類化該模型

關于 QAbstractItemModel 學習的一點分享

簡介:

Qt的模型、視圖框架對處理一些復雜數據結構的可視化非常有用。

Qt提供了三種常用的數據模型:QAbstractListModel (表單模型)、QAbstractTableModel (表格模型)、QAbstractItemModel (項目模型)。
其中第三種模型最靈活。前兩種模型都是繼承第三種模型的類的。

Qt的幫助文檔里有提到:

If you need a model to use with an item view such as QML’s List View element or the C++ widgets QListView or QTableView, you should consider subclassing QAbstractListModel or QAbstractTableModel instead of this class.

可以看出,如果是listView 或者 tableView 那么就考慮前兩種數據模型,但是如果是treeView,那就只好選擇QAbstractItemModel (項目模型)了。

可以這樣理解,QAbstractListModel 是QAbstractTableModel 的特殊化,QAbstractTableModel 是QAbstractItemModel 的特殊化。

接下來,我們著中來理解下QAbstractItemModel類。

關于QAbstractItemModel類的細節描述:

1、QAbstractItemModel 類提供了共模型視圖框架中的其他組件訪問的接口。

2、使用QAbstractItemModel 類,應當子類化。不能直接創建該類的對象。

3、AbstractItemModel 類 支持的 The underlying data model (底層的數據模型)是一個類似hierarchy of tables(有層級關系的表格),如果沒有層級,那就只有rows(行) 和colums(列)。但在AbstractItemModel 類中,還有QModelIndex(索引),這樣,每一個Item 就是一個獨立的表格單元。如下圖:


4、對于每一個數據單元(item of data)可以通過index() 索引,它的子項可以通過sibling()索引,它的父項可以通過parent()索引。

5、對于每一個數據單元都有一些data elements(數據元素)來界定( Qt::ItemDataRole)數據的角色。該數據元素可以通過data()放來來獲取:

如:
QVariant str = item2->data(Qt::ToolTipRole);

qDebug()<<str;

下表列出了數據角色:


什么是數據角色?可以這樣理解對于每個item呈現給用戶的視角是多方面的,比如:ToolTipRole 角色中的數據是只有當鼠標移到視圖中多對應的Item才會顯示。
例如,下圖中選中的Item中 有三個角色,分別是藍色的圖標、字符"B"、提示“”indexB“”。

6、在每一個item中,每個數據角色會對應一個數據,通過setData()方法來為指定的數據角色設定數據。setItemData()方法 則是為所有的數據角色設定相同的數據。

7、hasChildren()方法可以確認是否有子項。

8、對于一個層級的表格,都有關于行和列的操作
rowCount() 、columnCount()、 insertRows(), insertColumns(), removeRows(), and removeColumns().

9 、該模型該提供了一些信號來表示數據的變化:dataChanged()、headerDataChanged() 、layoutChanged()

子類化該模型

1、在只讀模型和基本的可編輯模型中,至少需要重寫index(), parent(), rowCount(), columnCount(), data()這些函數。

2、重寫 hasChildren()函數來提供一些特殊的模型的行為。

3、如果模型是可編輯的,那么還需要重載setData() 和 flags().

4、重寫headerData()和setHeaderData()對標題進行編輯。

5、在setData()和setHeaderData()函數中必須明確的加載 dataChanged() and headerDataChanged() 信號。

6、對于自定義模型,需要創建模型的索引,這里會用到createIndex()。

7、模型的重構會用到插入刪除行列insertRows(), removeRows(), insertColumns(),and removeColumns(). 在這些操作中it is important to notify any connected views about changes to the model’s dimensions both before and after they occur:

例如:

bool TreeModel::insertColumns(int position, int columns, const QModelIndex &parent) {beginInsertColumns(parent, position, position + columns - 1);const bool success = rootItem->insertColumns(position, columns);endInsertColumns();return success; }

8、重寫fetchMore() and canFetchMore()使數據模型遞增。

有關子類化的相關實現 可以參考Qt的示例代碼:Simple Tree Model

在Qt的幫助文檔中還有一篇 Model/View Programming 的介紹,該文檔中Model Subclassing Reference 就有提到如何子類化。

總結

以上是生活随笔為你收集整理的关于 QAbstractItemModel 学习的一点分享的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。