多列QTreeView/QAbstractItemModel子树

问题描述:

我正在研究一个QAbstractItemModel的子类,它插入QTreeView。它有一个递归的Name = Value类型结构 - 任何索引都可以有自己的子树。这在左侧是很好的,因为几乎所有的树都是以这种方式工作的。问题是有时候我只想在右侧使用一个子树 - 一个值列表。正如我现在所看到的,它似乎应该工作,但Qt从来没有打电话rowCount()右侧,并从来没有意识到,应该有一个子树那里。多列QTreeView/QAbstractItemModel子树

我现在所拥有的解决方案基本上是为此创建一个单独的模型,并在每次发生这种情况时使用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(),即使我的模型返回的结果是肯定的,但如果有人问到,则会有孩子。如果我最终不得不给它一个子树视图,那很好。我只想确定没有更好的方法来做到这一点。

+0

你有没有找到解决方案?我有类似的情况,但抽象的项目模型似乎只允许第一列下的子树。 – subhacom 2012-12-06 11:56:38

+0

我通过在第二列中放置单独的树视图来解决它,如果我需要它扩展。不是最优雅的方法,但快速和容易。如果你希望它看起来无缝,你可能必须继承QTreeView。自从去年5月份以来,我还没有和Qt一起做过任何工作,所以我不能真正帮助过去。 – parkovski 2012-12-27 23:32:54

我试图实现双重树视图我自己,有些东西一样

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

,从我已经看到你可以通过例如返回空数据使2名和3名之间的空间名称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 
    ... 

我不知道有足够的了解角色还,但使“空白”不是由用户selectabe您可以禁用选择和编辑。

但我还没有弄清楚如何在第二列获得一棵树。