QTreeView的模型的写法注意事项

原文: http://johnsmith9th.iteye.com/blog/1178034

1. 写一个树型数据结构 
2. 从QAbstractItemModel派生一个类,这个类包含或引用上述树形数据结构。 
3. 至少实现 index, parent, data, rowCount和columnCount这5个纯虚函数。index和parent函数其实就是从树形数据结构转换出合适的QModelIndex回答给Qt的框架,QModelIndex含有一个指针,可以指向树形数据结构的节点。
4. 根节点,也就是树上看不见的那个节点,必须对应一个非法的QModelIndex,所以你的树形数据结构的根节点从来不会有一个QModelIndex的internalPointer指向它,也永远不要用createIndex来包含你的树形数据结构的根节点,记住,和你的树形数据结构的根节点对应的QModelIndex是一个非法的QModelIndex。 
5.index函数的含义就是给你一个父QModelIndex,请你回答一下这个父亲的第row个孩子的QModelIndex,当然这个QModelIndex要指向正确的第row个孩子,这里的row是本级的概念,不是全局的概念,传入的row不会超过父ModelIndex的孩子个数。所以这个函数的签名应该改成GetChildModelIndexAccordingToParentModelIndexBySpecifiedRowAndColumn().当然这个签名有点长,所以没有被采纳。 
6.parent函数的含义就是给你一个孩子的ModelIndex,请你回答出它的父亲的ModelIndex.当然,由于ModelIndex携带行列信息,所以,为了得知父亲ModelIndex的行值,往往需要得到祖父,然后判断父亲属于祖父的哪个孩子。这个函数必须保证第4条得以遵循。 
7.rowCount回答某个父ModelIndex包含了多少个孩子。 
8.data函数需要加以重视,简单的情况下你只需要关心DisplayRole,根据传入ModelIndex的列值,取出你的树形数据结构里的节点的文本返回则可;而对于你不懂或不关心的角色一定要返回QVaraint(),否则你会发现什么都显示不出来。 
9.最后把你的树形结构构建好,让QAbstractItemModel的派生类能够引用到它,并且将该model的实例用QTreeView的setModel方法设入就好了。

你可能感兴趣的:(QTreeView)