PyQt - 在QTreeWidget中获取所有被选中的列表。

问题描述 投票:5回答:3

我正在建立一个简单的应用程序来打开一个数据文件夹并绘制数据。导入数据会更新一个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 "按钮时,界面首先检查哪些信号框被选中,然后绘制这些信号。

在我所有的例子中,似乎树的项目都是显式声明的(例如 item_1, item_2),所以引用它们很简单。但由于我填充树的方式,我不明白如何做到这一点。

如果这是一种不正确的填充树的方法,请告诉我,或者给我指出一个更正确的方法。

谢谢你

编辑。

这非常类似于: PyQT QTreeWidget迭代。

这就是我的答案的基础。

python pyqt qtreewidget qt-signals
3个回答
6
投票

想通了。这至少达到了我需要它实现的目的。

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
投票

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

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

0
投票

五年后,我一直在寻找你第二个问题的答案。虽然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

无论哪种情况,只要找到一个有子项的项目,函数就会调用自己,直到遍历整个树。

© www.soinside.com 2019 - 2024. All rights reserved.