PyQt4 Qtreewidget - 如果子复选框被选中获取层级文本
我现在想做的是,从一个已经填充好的树形结构(qtreewidget)中获取信息。这个树的最底层子项有复选框,如果某个复选框被选中,我想得到这个子项的路径文本。这样做的原因是,如果一个子项被选中,就会改变一个字典中某个键的值。(这个字典是用来创建树的原始数据)。下面是我想表达的一个视觉示例:
- 通过用户输入和服务器目录爬虫,我们填充了一个树形结构,像这样: (只有最底层的子项有复选框。)抱歉这个树形图画得很糟糕!希望你能理解……
编辑过
学习
-主题 1
--日期
---[]c
---[]d
---[]e
-主题 2
--日期
---[]g
---[]h
如果有人选中了“g”这个子项,有没有办法得到“g”的路径,格式可以是 [1, B, g] 或者 1-B-g 或者 1/B/g 等等?
树中的某些子项(比如例子中的 A 和 B)也可以由用户编辑。所以我需要从树中获取信息,而不是树最开始填充时的数据。
我尝试打印 self.ui.treeWidget 的索引,但没有真正得到我想要的结果。我觉得这个问题应该有简单的解决办法,但我找不到。希望有人能帮忙!
实际代码片段:
for h,study in enumerate(tree_dict['study']):
study_name = study['study_name']
treeSTUDY = QtGui.QTreeWidgetItem(self.ui.treeWidget, [study_name])
treeSTUDY.setFlags(QtCore.Qt.ItemIsEnabled)
self.ui.treeWidget.expandItem(treeSTUDY)
for i,subject in enumerate(study['subject']):
subject = subject['ID']
treeSUBJECT = QtGui.QTreeWidgetItem(treeSTUDY, [subject_id])
treeSUBJECT.setFlags(QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled)
for j,visit in enumerate(subject['visit']):
scan_date = visit['date']
treeDATE = QtGui.QTreeWidgetItem(treeSUBJECT, [scan_date[4:6])
treeDATE.setFlags(QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled)
for k,ser in enumerate(visit['series']):
s_name = ser['name'] + '-' + ser['description']
count = str(ser['count'])
treeSCAN = QtGui.QTreeWidgetItem(treeDATE)
treeSCAN.setFlags(QtCore.Qt.ItemIsEditable | QtCore.Qt.ItemIsEnabled | QtCore.Qt.ItemIsUserCheckable)
treeSCAN.setCheckState(0, QtCore.Qt.Unchecked)
treeSCAN.setText(0, s_name)
treeSCAN.setText(1, ser['time'])
treeSCAN.setText(2, ser['number'])
treeSCAN.setText(3, 'count')
1 个回答
3
你只需要一个方法,沿着父子关系链向上走,抓取每个项目的文本,直到父项是 None
为止:
def getTreePath(self, item):
path = []
while item is not None:
path.append(str(item.text(0)))
item = item.parent()
return '/'.join(reversed(path))
更新:
这里有一个演示脚本,展示了如何获取被选中的项目并找出它的路径:
from PyQt4 import QtCore, QtGui
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.tree = QtGui.QTreeWidget(self)
self.tree.setHeaderHidden(True)
for index in range(2):
parent = self.addItem(self.tree, 'Item%d' % index)
for color in 'Red Green Blue'.split():
subitem = self.addItem(parent, color)
for letter in 'ABC':
self.addItem(subitem, letter, True, False)
layout = QtGui.QVBoxLayout(self)
layout.addWidget(self.tree)
self.tree.itemChanged.connect(self.handleItemChanged)
def addItem(self, parent, text, checkable=False, expanded=True):
item = QtGui.QTreeWidgetItem(parent, [text])
if checkable:
item.setCheckState(0, QtCore.Qt.Unchecked)
else:
item.setFlags(
item.flags() & ~QtCore.Qt.ItemIsUserCheckable)
item.setExpanded(expanded)
return item
def handleItemChanged(self, item, column):
if item.flags() & QtCore.Qt.ItemIsUserCheckable:
path = self.getTreePath(item)
if item.checkState(0) == QtCore.Qt.Checked:
print('%s: Checked' % path)
else:
print('%s: UnChecked' % path)
def getTreePath(self, item):
path = []
while item is not None:
path.append(str(item.text(0)))
item = item.parent()
return '/'.join(reversed(path))
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.setGeometry(500, 300, 250, 450)
window.show()
sys.exit(app.exec_())