pyqt5中画好的树形结构复选框都是没选中状态,当手动选中一些节点时,复选框会显示选中,将选中的复选框里内容标题填写到json中,当取消选中复选框里的勾会取消,对应的json文件里的内容也会更改,用python实现
时间: 2024-05-11 10:16:28 浏览: 126
可以使用QTreeWidget和QTreeWidgetItem实现树形结构的显示和复选框功能,结合写入和读取json文件实现保存和修改数据。
具体步骤如下:
1. 创建一个QTreeWidget对象和根节点QTreeWidgetItem对象。
```python
# 创建QTreeWidget对象和根节点对象
tree_widget = QTreeWidget()
root_node = QTreeWidgetItem(tree_widget)
```
2. 为根节点设置展示名称和复选框。
```python
# 设置根节点名称和复选框
root_node.setText(0, "根节点")
root_node.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)
root_node.setCheckState(0, Qt.Unchecked)
```
3. 向根节点添加子节点,设置子节点名称和复选框。
```python
# 添加子节点,设置名称和复选框
child_node = QTreeWidgetItem(root_node)
child_node.setText(0, "子节点")
child_node.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)
child_node.setCheckState(0, Qt.Unchecked)
```
4. 绑定QTreeWidgetItem的状态变化信号,当复选框选中时读取节点的名称和勾选状态,并保存到json文件中。
```python
# 绑定复选框状态变化信号
tree_widget.itemChanged.connect(lambda item, column: self.on_item_changed(item))
# 处理复选框状态变化
def on_item_changed(self, item):
if item.checkState(0) == Qt.Checked:
print(item.text(0), "选中")
# 将节点名称和勾选状态写入json文件
else:
print(item.text(0), "未选中")
# 将节点名称和勾选状态从json文件中删除
```
5. 读取json文件中的数据,初始化树形结构节点的勾选状态。
```python
# 初始化树形结构勾选状态
def init_tree_widget(self):
# 读取json文件中的内容,设置节点勾选状态
# 遍历所有节点,设置勾选状态
for i in range(tree_widget.topLevelItemCount()):
item = tree_widget.topLevelItem(i)
if item.text(0) in selected_items:
item.setCheckState(0, Qt.Checked)
```
完整的代码示例如下:
```python
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
import json
class TreeWidget(QWidget):
def __init__(self):
super().__init__()
# 创建QTreeWidget对象和根节点对象
tree_widget = QTreeWidget()
root_node = QTreeWidgetItem(tree_widget)
# 设置根节点名称和复选框
root_node.setText(0, "根节点")
root_node.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)
root_node.setCheckState(0, Qt.Unchecked)
# 添加子节点,设置名称和复选框
child_node = QTreeWidgetItem(root_node)
child_node.setText(0, "子节点")
child_node.setFlags(Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled | Qt.ItemIsUserCheckable)
child_node.setCheckState(0, Qt.Unchecked)
# 添加树形结构,设置大小
layout = QVBoxLayout()
layout.addWidget(tree_widget)
self.setLayout(layout)
self.setMinimumSize(300, 400)
# 绑定复选框状态变化信号
tree_widget.itemChanged.connect(lambda item, column: self.on_item_changed(item))
# 初始化树形结构勾选状态
selected_items = self.get_selected_items()
self.init_tree_widget(tree_widget, selected_items)
# 处理复选框状态变化
def on_item_changed(self, item):
if item.checkState(0) == Qt.Checked:
print(item.text(0), "选中")
# 将节点名称和勾选状态写入json文件
else:
print(item.text(0), "未选中")
# 将节点名称和勾选状态从json文件中删除
# 初始化树形结构勾选状态
def init_tree_widget(self, tree_widget, selected_items):
# 遍历所有节点,设置勾选状态
for i in range(tree_widget.topLevelItemCount()):
item = tree_widget.topLevelItem(i)
if item.text(0) in selected_items:
item.setCheckState(0, Qt.Checked)
# 获取已选中的节点列表
def get_selected_items(self):
with open("data.json", "r", encoding="utf-8") as f:
data = json.load(f)
return data.get("selected_items", [])
if __name__ == '__main__':
app = QApplication([])
tree_widget = TreeWidget()
tree_widget.show()
app.exec_()
```
阅读全文