PyQt4 Qtreewidget - 如果选中子复选框,则获取层次结构文本

时间:2014-03-15 04:48:36

标签: python pyqt pyqt4 qtreewidget qcheckbox

我目前要做的是采用一个填充树(qtreewidget),该树在底部子级别具有复选框,如果选中该框,则返回子项的路径文本。我想这样做的原因是,如果检查子项,它将更改字典中键的值。 (" raw"树是从中创建的字典)。这是我的意思的一个直观的例子:

  1. 从用户输入和服务器目录抓取,我们填充了一个如下所示的树: (只有最低级别的子项目有复选框。)抱歉可怕的树形图!!希望它有意义......
  2. 编辑

    研究

    -subject 1

    - 日期

    --- []ç

    --- [] d

    --- []ë

    -subject 2

    - 日期

    --- []克

    --- [1 H

    1. 如果有人检查(例如)" g" levle孩子,无论如何要去那条路,然后去#34; g"以[1,B,g]或1-B-g或1 / B / g等形式?

    2. 其中一个子级别(例如,在示例A和B中)也设置为用户可编辑。所以我需要树中的信息,而不是树最初填充的信息。

    3. 我已经尝试打印self.ui.treeWidget索引而没有真正的运气来获得我想要的东西。我觉得好像有一个简单的解决方案,但我似乎无法找到它。希望有人可以提供帮助!

      实际代码段:

          for h,study in enumerate(tree_dict['study']):
              study_name = study['study_name']
              treeSTUDY = QtGui.QTreeWidgetItem(self.ui.treeWidget, [study_name])
              treeSTUDY.setFlags(QtCore.Qt.ItemIsEnabled)
              self.ui.treeWidget.expandItem(treeSTUDY)            
      
              for i,subject in enumerate(study['subject']):
                  subject = subject['ID']
                  treeSUBJECT = QtGui.QTreeWidgetItem(treeSTUDY, [subject_id])
                  treeSUBJECT.setFlags(QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled)
      
                  for j,visit in enumerate(subject['visit']):
                      scan_date = visit['date']                     
                      treeDATE = QtGui.QTreeWidgetItem(treeSUBJECT, [scan_date[4:6])
                      treeDATE.setFlags(QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled)
      
                      for k,ser in enumerate(visit['series']):
                          s_name = ser['name'] + '-' + ser['description']
                          count =  str(ser['count'])
                          treeSCAN = QtGui.QTreeWidgetItem(treeDATE)
                          treeSCAN.setFlags(QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsUserCheckable)
                          treeSCAN.setCheckState(0, QtCore.Qt.Unchecked)   
                          treeSCAN.setText(0, s_name)
                          treeSCAN.setText(1, ser['time'])
                          treeSCAN.setText(2, ser['number'])
                          treeSCAN.setText(3, 'count')
      

1 个答案:

答案 0 :(得分:3)

您需要的是一种方法,该方法可以使父/子链获取每个项目的文本,直到父项为None

def getTreePath(self, item):
    path = []
    while item is not None:
        path.append(str(item.text(0)))
        item = item.parent()
    return '/'.join(reversed(path))

<强>更新

这是一个演示脚本,演示如何获取已检查项目并检索其路径:

from PyQt4 import QtCore, QtGui

class Window(QtGui.QWidget):
    def __init__(self):
        QtGui.QWidget.__init__(self)
        self.tree = QtGui.QTreeWidget(self)
        self.tree.setHeaderHidden(True)
        for index in range(2):
            parent = self.addItem(self.tree, 'Item%d' % index)
            for color in 'Red Green Blue'.split():
                subitem = self.addItem(parent, color)
                for letter in 'ABC':
                    self.addItem(subitem, letter, True, False)
        layout = QtGui.QVBoxLayout(self)
        layout.addWidget(self.tree)
        self.tree.itemChanged.connect(self.handleItemChanged)

    def addItem(self, parent, text, checkable=False, expanded=True):
        item = QtGui.QTreeWidgetItem(parent, [text])
        if checkable:
            item.setCheckState(0, QtCore.Qt.Unchecked)
        else:
            item.setFlags(
                item.flags() & ~QtCore.Qt.ItemIsUserCheckable)
        item.setExpanded(expanded)
        return item

    def handleItemChanged(self, item, column):
        if item.flags() & QtCore.Qt.ItemIsUserCheckable:
            path = self.getTreePath(item)
            if item.checkState(0) == QtCore.Qt.Checked:
                print('%s: Checked' % path)
            else:
                print('%s: UnChecked' % path)

    def getTreePath(self, item):
        path = []
        while item is not None:
            path.append(str(item.text(0)))
            item = item.parent()
        return '/'.join(reversed(path))

if __name__ == '__main__':

    import sys
    app = QtGui.QApplication(sys.argv)
    window = Window()
    window.setGeometry(500, 300, 250, 450)
    window.show()
    sys.exit(app.exec_())