pyqt5中画好的树形结构复选框都是没选中状态,当手动选中一些节点时,复选框会显示选中,将选中的复选框里内容标题填写到json中,用python实现
时间: 2024-05-08 12:18:23 浏览: 101
tree 树形结构带复选框
首先,你可以使用PyQt5的QTreeWidget和QTreeWidgetItem来实现树形结构的显示。在QTreeWidgetItem添加子项时,可以设置复选框属性,并且在选中时可以监听QTreeWidgetItem的状态变化事件。
以下是一个示例代码,可以在树形结构中选择节点并将节点信息保存到JSON文件中:
```python
import json
from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeWidgetItem, QTreeWidget
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.tree = QTreeWidget(self)
self.tree.setHeaderLabels(['Node'])
root = QTreeWidgetItem(self.tree, ['Root'])
child1 = QTreeWidgetItem(root, ['Child1'])
child2 = QTreeWidgetItem(root, ['Child2'])
child3 = QTreeWidgetItem(child2, ['Child3'])
for item in (root, child1, child2, child3):
item.setFlags(item.flags() | Qt.ItemIsUserCheckable)
item.setCheckState(0, Qt.Unchecked)
item.childEvent = self.childModified
self.setCentralWidget(self.tree)
def childModified(self, event):
if event.type() == QTreeWidgetItem.ChildAdded:
event.child().setFlags(event.child().flags() | Qt.ItemIsUserCheckable)
event.child().setCheckState(0, Qt.Unchecked)
event.child().childEvent = self.childModified
item = event.child() or event
if item.checkState(0) == Qt.Checked:
print('Selected node:', item.text(0))
self.writeToJson()
def writeToJson(self):
data = self.getDataFromTree()
with open('data.json', 'w') as f:
json.dump(data, f, ensure_ascii=False, indent=4)
def getDataFromTree(self):
def recursiveLoad(items):
nodes = []
for index in range(items.childCount()):
item = items.child(index)
node = {
"text": item.text(0),
"checked": True if item.checkState(0) == Qt.Checked else False,
"children": recursiveLoad(item)
}
nodes.append(node)
return nodes
return recursiveLoad(self.tree.invisibleRootItem())
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
```
这个程序创建一个带有复选框的树形控件。当您选中一个节点时,它将输出节点的文本内容。当您选择或取消选择节点时,程序将自动将所有节点信息保存到json文件中。
希望这可以帮助您实现一个类似的功能。
阅读全文