【问题标题】:PyQt - get list of all checked in QTreeWidgetPyQt - 获取 QTreeWidget 中所有检查的列表
【发布时间】:2015-01-13 20:08:36
【问题描述】:

我正在构建一个简单的应用程序来打开一个数据文件夹并绘制该数据。导入数据会更新一个 QTreeWidget,它显示哪些信号可用于绘制。例如:

QTreeWidget 在数据导入后使用:

def update_treeWidget(self):
    headers = self.df['voltage recording'].columns[1:]
    sweeps = self.df['voltage recording'].index.levels[0]

    for header in headers:
        parent_item = QtWidgets.QTreeWidgetItem(self.treeWidget)
        parent_item.setCheckState(0, QtCore.Qt.Unchecked)
        parent_item.setText(0, header)

        for sweep in sweeps:
            child_item = QtWidgets.QTreeWidgetItem(parent_item)
            child_item.setCheckState(0, QtCore.Qt.Unchecked)
            child_item.setText(0, sweep)

不过,我不清楚如何检查树中现在任何项目的已检查状态。

所以我的两个问题是:

  1. 我如何引用该树的任何部分来检查它的检查状态(父级或父级的各个子级)

  2. 有没有办法简单地返回所有选中框的列表?如果我能找出问题 1 的答案,我显然可以创建一个函数,每次选中一个框时,它都会添加到列表中(如果未选中,则从该列表中删除)。但是由于这里的目标只是绘制所有检查的信号,对我来说最直接的事情(无论如何逻辑上)是在点击“Plot”按钮时,界面首先检查哪些信号框被选中,然后绘制这些信号。

在所有示例中,我似乎都明确声明了树项(即 item_1、item_2),因此引用它们很简单。但是,由于我如何填充树,我不明白该怎么做。

如果首先填充树的方法不正确,请告诉我和/或指出更正确方法的方向。

谢谢

编辑:

这非常类似于: PyQT QTreeWidget iterating

这是我回答的依据。

【问题讨论】:

    标签: python pyqt qtreewidget qt-signals


    【解决方案1】:

    想通了。这至少实现了我需要它实现的目标:

    def find_checked(self):
        checked = dict()
        root = self.treeWidget.invisibleRootItem()
        signal_count = root.childCount()
    
        for i in range(signal_count):
            signal = root.child(i)
            checked_sweeps = list()
            num_children = signal.childCount()
    
            for n in range(num_children):
                child = signal.child(n)
    
                if child.checkState(0) == QtCore.Qt.Checked:
                    checked_sweeps.append(child.text(0))
    
            checked[signal.text(0)] = checked_sweeps
    
        return checked
    

    【讨论】:

    • invisibleRootItem 和 topLevelItemCount 有什么区别?
    【解决方案2】:

    可以使用下一个解决方案:

    for item in self.QTreeWidget.findItems("", Qt.MatchContains | Qt.MatchRecursive):
        if (item.rowCount() == 0 and item.checkState()>0):
            print (item.text(),item.checkState())
    

    【讨论】:

      【解决方案3】:

      五年后,我正在寻找您第二个问题的答案。虽然 dan_g 的代码非常有用,但我相信如果树深度大于 2,它不会列出所有项目。我创建了一个递归版本,它将列出所有选定项目,无论它们在树中的级别如何。

          def get_selected_items(self):
              checked_items = []
              def recurse(parent_item):
                  for i in range(parent_item.childCount()):
                      child = parent_item.child(i)
                      grand_children = child.childCount()
                      if grand_children > 0:
                          recurse(child)
                      if child.checkState(0) == Qt.Checked:
                          checked_items.append(child.text(0))
      
              recurse(self.ui.treeWidget.invisibleRootItem())
              return checked_items
      

      或者在我的情况下,如果您只想在树的叶子上列出选定的项目,只需添加 else 语句。

          def get_selected_leaves(self):
              checked_items = []
              def recurse(parent_item):
                  for i in range(parent_item.childCount()):
                      child = parent_item.child(i)
                      grand_children = child.childCount()
                      if grand_children > 0:
                          recurse(child)
                      else: 
                          if child.checkState(0) == Qt.Checked:
                              checked_items.append(child.text(0))
      
              recurse(self.ui.treeWidget.invisibleRootItem())
              return checked_items
      

      在任何一种情况下,只要找到具有子项的项,该函数就会调用自身,直到遍历整个树。

      【讨论】:

        猜你喜欢
        • 2014-11-13
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多