Python QtreeWidget:返回树形层次结构

0 投票
1 回答
2437 浏览
提问于 2025-04-15 16:33

我在尝试获取一个小部件树的层级视图时遇到了困难。

代码运行得很好,生成了一个漂亮的树,像这样:

ROOT(Animal): 
| 
| 
|___Not extinct:
.         |                       (red)
.         |_____BIRD--------------(blue)
.         |                       (green)
          | 
          |                       (red)
          |_____Mammal------------(blue)
          |                       (green)
          | 
          |                       (red)
          |_____Reptile-----------(blue)
                                  (green)

下面是包含树层级的代码:

def myTreeWDG(self):
    ....
    """define tree"""
    self.obj_animalTreeWDG = QtGui.QTreeWidget(self.obj_viewGroupBox)
    self.obj_animalTreeWDG.setGeometry(QtCore.QRect(10, 20, 191, 131))
    self.obj_animalTreeWDG.setObjectName("obj_animalTreeWDG")
    """ROOT: animal"""
    obj_parent1 = QtGui.QTreeWidgetItem(self.obj_animalTreeWDG)
    """not extinct:"""
    obj_childView1_1 = QtGui.QTreeWidgetItem()
    obj_parent1.addChild(obj_childView1_1)
    """bird"""
    obj_childView1_1_1 = QtGui.QTreeWidgetItem()
    obj_childView1_1.addChild(obj_childView1_1_1)
    """3: red, blue, green"""
    total=3
    self.insert_treeLeaves(total,obj_childView1_1_1)
    """mamal"""
    obj_childView1_1_2 = QtGui.QTreeWidgetItem()
    obj_childView1_1.addChild(obj_childView1_1_2)
    """3: red, blue, green"""
    total=3
    self.insert_treeLeaves(total,obj_childView1_1_2) 
    """reptile"""
    obj_childView1_1_3 = QtGui.QTreeWidgetItem()
    obj_childView1_1.addChild(obj_childView1_1_3)
    """3: red, blue, green"""
    total=3
    self.insert_treeLeaves(total,obj_childView1_1_3) 
    """connect event"""
    QtCore.QObject.connect(self.obj_animalTreeWDG, QtCore.SIGNAL('itemClicked(QTreeWidgetItem*, int)'), self.obj_treeViewInput)

这是将叶子添加到树中的代码:

def insert_treeLeaves(self,total,tree_directParent):
    for i in range(0,total):
        """leaves with color name"""
        tree_child_leaf = QtGui.QTreeWidgetItem()
        tree_directParent.addChild(tree_child_leaf)

接下来,我们有一个函数,它会告诉我们每次点击树时,点击的位置在哪里:

def obj_treeViewInput(self,item,col):
    print "obj _Qtree : pressed"
    print "name:" item.text(col)

问题是,我们怎么知道被点击的叶子(红色)属于鸟类还是其他的父节点,也就是说,如何在某次鼠标点击后得到这样的输出:动物 - 未灭绝 - 哺乳动物 - (红色)。

非常感谢大家的评论和建议。

1 个回答

2

你有没有想过在每个 QtreeWidgetItem 里加一个方法,可以打印出这个项目的路径?

在这个方法里,你可以用递归的方式来获取这个项目所有父级的完整路径(你可以用 "QTreeWidgetItem * parent () const" 这个方法来做到这一点),然后把当前项目的文本加到它父级的路径上!当一个项目没有父级的时候,你就停止递归。

我希望我理解了你的问题,这对你有一点帮助!

你有自己的 QTreeWidgetItem 类吗?你可以用一个特定的角色来实现这个功能……

撰写回答