我正在建立一个简单的应用程序来打开一个数据文件夹并绘制数据。导入数据会更新一个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迭代。
这就是我的答案的基础。
想通了。这至少达到了我需要它实现的目的。
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
可以使用下一个解决方案。
for item in self.QTreeWidget.findItems("", Qt.MatchContains | Qt.MatchRecursive):
if (item.rowCount() == 0 and item.checkState()>0):
print (item.text(),item.checkState())
五年后,我一直在寻找你第二个问题的答案。虽然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
无论哪种情况,只要找到一个有子项的项目,函数就会调用自己,直到遍历整个树。