我正在构建一个简单的应用程序来打开数据文件夹并绘制该数据。导入数据会更新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的答案,我显然可以创建一个函数,每次检查一个框时,它都会被添加到一个列表中(如果未选中则从该列表中删除)。但由于这里的目标仅仅是绘制所有已检查的信号,对我来说最直接的事情(逻辑上无论如何)是在点击" Plot"按钮接口首先检查以查看检查哪些信号框,然后绘制这些信号。
在所有示例中,我似乎都明确声明了树项(即item_1,item_2),因此引用它们很简单。但是,由于我如何填充树,我不明白该怎么做。
如果这是首先填充树的错误方法,请告诉我和/或指出我更正确的方法。
由于
编辑:
这非常类似于: PyQT QTreeWidget iterating
这是我根据我的答案。
答案 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())