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实例,那么模型或者视图将会自行设置合理的尺寸。同理,对于其它影响数据显示的角色,我们也需要进行角色判断,并给出合适的数据。

posted on 2014-07-05 15:20  lixtary  阅读(5488)  评论(0编辑  收藏  举报

导航