QTreeWidgetItem.addChild()在某些情况下不起作用?

时间:2018-06-19 12:08:09

标签: python pyside2

我在将孩子添加到QTreeWidget的顶级项目时遇到麻烦。 我有一个QTreeWidget,用户可以在其中单击一个按钮来添加称为“步骤”的项目。它仅包含两个级别,并显示为以下示例:

- TreeWidget
   - step1
       - step1.1
       - step1.2
       - [add sub-step button]
   - step2
       - step2.1
       - [add sub-step button]
   - [add step button]   

因此,当单击“添加子步骤按钮”时,它应该在按钮本身之前添加一个新的子项到相关的顶层项目中,并且可以正常工作。但是,当单击“添加步骤按钮”时,它应该添加一个顶层项目并向其中添加一个包含新按钮的子项。问题在于为新按钮添加了子元素。
按钮已连接到该插槽:

@Slot(int)
def addCustomStep(self, parentIndex):
    newStep = QTreeWidgetItem()
    newStep.setFlags(Qt.ItemIsEnabled | Qt.ItemIsUserCheckable | Qt.ItemIsEditable)
    if parentIndex == -1:
        #add a top-level step with button
        index = self.treeWidget.invisibleRootItem().childCount() - 1
        self.treeWidget.insertTopLevelItem(index, newStep)
        child = QTreeWidgetItem()
        child.setSizeHint(0, QSize(0, CSTM_STEP_WIDGET_HEIGHT))
        child.setFlags(Qt.ItemIsEnabled)
        cstmWidget = CustomStepWidget(self.treeWidget, index) #the button
        cstmWidget.click.connect(self.addCustomStep)
        newStep.addChild(child) #this is the line that doesn't work for some reason
        self.treeWidget.setItemWidget(child, 0, cstmWidget)
    else:
        #add a sub-step to parent
        parentItem = self.treeWidget.invisibleRootItem().child(parentIndex)
        parentItem.insertChild(parentItem.childCount() - 1, newStep)
    self.treeWidget.editItem(newStep, 0)

我没有错误消息,但是当我单击“添加步骤按钮”时,它仅添加顶层项,而不添加包含该按钮的子项。我在qt文档或google中找不到任何原因。 我尝试过的方法(但仍然不会在'newStep'中添加一个孩子):

  • 添加“普通儿童”而不是自定义小部件
  • 具有默认名称,因此无法编辑
  • 添加子项之前进行编辑
  • newStep.addChild(child)代替self.treeWidget.invisibleRootItem().child(index).addChild(child)
  • 测试将按钮添加到另一个顶级项目。例如:self.treeWidget.invisibleRootItem().child(0)(有效)

我正在使用pyside2,它正在Maya2018的python解释器中执行(如果此信息有帮助)

这是一个git hub链接,指向我的代码的简化版本,因此您可以自己进行测试:addStepsExample 有人可以看到并解释出什么问题吗?

1 个答案:

答案 0 :(得分:0)

问题真的很简单,当在显示QTreeWidget之后将一个孩子添加到一个项目中时,默认情况下它们是折叠的,因此无法观察到,解决方案是将其扩展:

...
step.addChild(child) #<-- ISN'T THIS SUPPOSED TO WORK??
self.addStepsTW.setItemWidget(child, 0, cstmWidget)
step.setExpanded(True)  #<--