PyQt - 获取QTreeWidget中所有已检入的列表

时间:2014-11-17 00:33:54

标签: python pyqt qtreewidget qt-signals

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

enter image description here

使用以下方法导入数据后填充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"按钮接口首先检查以查看检查哪些信号框,然后绘制这些信号。

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

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

    由于

    编辑:

    这非常类似于: PyQT QTreeWidget iterating

    这是我根据我的答案。

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

五年后,我正在寻找第二个问题的答案。尽管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

在任何一种情况下,函数只要找到包含子项的项就调用自身,直到遍历整个树为止。

答案 2 :(得分:0)

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

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