QTreeView / QAbstractItemModel在多列中进行子树化

时间:2012-03-19 23:22:34

标签: qt qt4 treeview qabstractitemmodel

我正在研究QAbstractItemModel的子类,它插入QTreeView。它具有递归Name = Value类型结构 - 任何索引都可以拥有自己的子树。这在左侧很好,因为几乎所有树视图都以这种方式工作。问题是,有时我只想在右侧显示一个子树 - 一个值列表。正如我现在所做的那样,似乎应该工作,但是Qt永远不会为正确的方面调用rowCount(),并且从未意识到那里应该有一个子树。

我现在拥有的解决方案基本上是为此创建一个单独的模型,并且每次发生这种情况时都使用setIndexWidget为它提供单独的树视图。这很好,但是我真的很想在右边显示子树,而不必在整个地方扔树视图。我的模型回应说那里有子树,但Qt从来没有问过它们。

如果这有点不清楚,这是我想要完成的基本想法:

- Root        |
  - Name 1    |    Value
      Name 2  |  - Compound Value
              |      Sub-value 1
              |      Sub-value 2
      Name 3  |  + Compound Value (collapsed)
  + Name 4    |    Value

实际上,复合值不会得到它们旁边的+-,因为Qt从不在该列中调用hasChildren()rowCount() ,即使我的模型会返回是,如果被问到,也会有孩子。

如果我最终不得不给它一个子树视图,那很好。我想确定首先没有更好的方法。

1 个答案:

答案 0 :(得分:0)

我正在尝试实现双树视图我的自我,有些像

+ a        |    A
  + b      |  + B
    c      |      C

从我所看到的你可以通过返回空数据来建立名称2和名称3之间的空格,例如在Name 2下面的一个空字符串,它可以让你有一个+面前的字符串。

这样的事情可能会有所帮助

def data(self, index, role): 
    ...
    if item.pathdepth() > 3 : 
        return " "
    ...

def flags(self, index)
    ...
    if item.pathdepth() > 3 : 
        return Qt.Some_Role but not others
    ...

我对角色还不太了解,但您可以禁用选择和编辑,以便用户不会选择“空白”。

但我还没有弄清楚如何在第二栏中找到一棵树。