2016-02-26 45 views
1

如果你是一个Pythonist,有一个存储在QVector<QVector<QString>> data;(或者一个列表的字符串列表)我应该如何子类QAbstractItemModel能够显示(只读)这样一个简单的结构在QTreeView?我想看到这样的事情:简单的2级层次结构子类化QAbstractItemModel

  • “组1”
    • 数据[0] [0]
    • 数据[0] [1]
  • “组2 “
    • 数据[1] [0]
    • 数据[1] [1]

从文档,我读,我应该重写index()parent()rowCount()columnCount()data()。为了实现我的目标,这些方法的最简单可能的实现是什么?

为了使可能的答案更具启发性,一个子类QAbstractItemModel如何不使用内部指针(存储在QModelIndex es)。我所看到的所有例子都是以树的形式使用底层模型,节点(有指向子节点和父节点的指针),这些节点使用内部指针很容易包装在QAbstractItemModel中。但是,即使没有树/节点式底层结构,也没有QModelIndex的内部指针,我们是否可以使用QAbstractItemModel?我的问题是基于文档说你可以使用内部指针,但我还没有看到没有它的任何示例。

+0

您的数据结构不足以表示2级层次结构。具体而言,顶级字符串没有存储空间 - 即“组1”,“组2”等。在python中,您需要使用如下形式:'[[“group1”,[1,2, 3]],[“group 2”,[1,2,3]],...]'。 – ekhumoro

+0

如果您没有使用内部指针,那么如何将模型索引映射到数据结构中的位置?看起来你需要使用parent()来做一个自下而上的遍历来计算数据结构中的一系列索引,而且这个数据结构必须通过模型的几乎所有方法不断重新计算,这使得它(累计)非常昂贵的操作,所以也许这就是为什么所有的例子都是基于内部指针(这有效缓存了昂贵的查找操作)。 – ekhumoro

回答

0

这真的并不重要,你使用层次结构的哪个级别,与QVector(常用的QList <的QString >的QList类似于到std :: deque的)来存储数据,并指向其子节点的QList <节点上创建自定义类节点 * >孩子。层次结构的顶层是不可见的根节点。然后在模型中处理数据。

真正伟大的引导,带节点和模型的例子:

http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html

基本上你可以复制粘贴代码,并实现自己的setupModelData方法。