Qt模型/視圖中的data和headerData


QAbstractItemModel

QAbstractItemModel是一個抽象類,該抽象類未實現的純虛方法有

 QModelIndex QAbstractItemModel::index(int row, int column, const QModelIndex & parent = QModelIndex()) const [pure virtual]

 QModelIndex QAbstractItemModel::parent(const QModelIndex & index) const [pure virtual]

 int QAbstractItemModel::rowCount(const QModelIndex & parent = QModelIndex()) const [pure virtual]

 int QAbstractItemModel::columnCount(const QModelIndex & parent = QModelIndex()) const [pure virtual]

 QVariant QAbstractItemModel::data(const QModelIndex & index, int role = Qt::DisplayRole) const [pure virtual]

 

index()

當模型是一個層級模型時,index()用於返回當父層級為parent時,parent下位置為(row, column)的子索引。

 

parent()

返回index的父索引,如果index為根索引或者index是無效索引,則返回QModelIndex()。

 

rowCount()

用於告訴模型和視圖,除去行標題之后,源數據的數據行數。

 

columnCount()

用於告訴模型和視圖,除去列標題之后,源數據的數據列數。

 

data()

模型獲取數據的具體實現。

 

該模型已經實現的重要虛方法有headerData()

virtual QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const

該方法的默認實現為:無論方向如何當role為Qt::DisplayRole則返回值為section+1的標題號,其他情形則返回空QVariant實例。

 

以前在套用書上的例子寫表格時,數據都能正常顯示。這次全部自己來寫卻發現表格視圖的列標題不顯示。經過調試發現只進行方向的判斷是不顯示標題數據的,只有再進行了角色判斷才會正確地顯示標題。按理說只進行方向判斷是包含了既進行了方向判斷又進行角色判斷這一情況的。最后查看QAbstractItemModel源碼才明白過來,模型(也可能是視圖)只會對空的QVarient,而不會對無意義的尺寸設置合適的尺寸。本來想看看到底是模型在設置默認值還是視圖在設置默認值的,但最后放棄了,一個函數定義好找,一個函數調用就太麻煩了。

無論是data()還是headerData(),在交付數據時我們都需要對數據的角色進行判斷,進而給出相應的數據,否則可能導致視圖無法顯示數據,或者數據顯示的方式不合理。數據不能顯示的原因在於若模型需要獲取表格的尺寸暗示時,此時的角色是Qt::SizeHintRole。若我們給出的是非空QVarient實例,那么模型將會使用該實例所包含的尺寸數據,若該尺寸數據有意義那么模型將使用該數據來定義表格大小,否則將表格尺寸設置為0x0(猜測);若我們給出的是空QVarient實例,那么模型或者視圖將會自行設置合理的尺寸。同理,對於其它影響數據顯示的角色,我們也需要進行角色判斷,並給出合適的數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM