PyQt - 获取 QTreeWidget 中所有已选中的项目列表

7

我正在构建一个简单的应用程序,用于打开数据文件夹并绘制其中的数据。导入数据会更新一个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的答案,我显然可以创建一个函数,在每次选中框时将其添加到列表中(如果取消选中,则从列表中删除)。但由于这里的目标仅是绘制所有已选信号,所以最直接的方法(逻辑上)是在点击“绘图”按钮时,界面首先检查哪些信号框被选中,然后绘制这些信号。

在所有示例中,树项都是明确声明的(即item_1、item_2),因此引用它们很简单。但由于我正在填充树的方式,我不明白如何做到这一点。

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

谢谢

编辑:

这与以下内容非常相似: PyQT QTreeWidget 迭代 这是我回答的基础。

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

invisibleRootItem 和 topLevelItemCount 有什么区别? - Wade Wang

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

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

1
下一个解决方案可以使用:
for item in self.QTreeWidget.findItems("", Qt.MatchContains | Qt.MatchRecursive):
    if (item.rowCount() == 0 and item.checkState()>0):
        print (item.text(),item.checkState())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接