• 【Python】QTreeWidget树形结构添加


    源码:

    1. # 参考网址: https://blog.csdn.net/weixin_42286052/article/details/129532631
    2. import os.path
    3. import sys
    4. from PySide6.QtWidgets import QApplication,QMainWindow,QHBoxLayout,QVBoxLayout,QPushButton,QTreeWidget,QTreeWidgetItem,QTreeWidgetItemIterator
    5. from PySide6.QtGui import QStandardItemModel,QStandardItem
    6. from QTreeWidgetUi import Ui_MainWindow
    7. from PySide6.QtCore import Qt,QAbstractItemModel
    8. import configparser
    9. class ParseNone():
    10. def __init__(self,fileName):
    11. self.config_path = os.path.join(os.path.dirname(__file__), fileName)
    12. self.config_ini = configparser.ConfigParser()
    13. self.config_ini.read(self.config_path,encoding="utf-8")
    14. # parser = ParseNone("config.ini")
    15. class TreeWidgetDemo(QMainWindow,Ui_MainWindow):
    16. def __init__(self, parent=None):
    17. super(TreeWidgetDemo, self).__init__(parent)
    18. self.setWindowTitle('TreeWidget 例子')
    19. self.setupUi(self)
    20. self.Listener()
    21. self.config = ParseNone("config.ini")
    22. self.tree = self.treeWidget
    23. self.tree.setHeaderLabels(['中国省份城市'])
    24. # 设置列数
    25. self.tree.setColumnCount(1)
    26. self.tree.setColumnWidth(0, 100)
    27. self.preview = QTreeWidgetItem(self.tree) # 实例化一个项目。参数:指定父类
    28. self.preview.setText(0, '中国')
    29. self.preview.setCheckState(0, Qt.Unchecked)
    30. for root in self.config.config_ini.sections():
    31. items = self.config.config_ini.items(root)
    32. parent = QTreeWidgetItem(self.preview)
    33. parent.setText(0, root)
    34. parent.setCheckState(0, Qt.CheckState.Unchecked)
    35. for item in items:
    36. node = QTreeWidgetItem(parent)
    37. node.setText(0,item[1])
    38. node.setCheckState(0,Qt.Unchecked)
    39. # 参数1 复选框的位置 列序号
    40. # Qt.Unchecked 没选中
    41. # Qt.Checked 选中
    42. # Qt.PartiallyChecked 部分选中
    43. # self.tree.expandAll()
    44. # 让所有的项都是以打开状态显示的。注意必须要在所有项都已经实例化好之后再调用该方法,如果一开始就调用则会没有效果
    45. self.tree.itemClicked.connect(self.handleChanged)
    46. # def handleChanged(self, item, column):
    47. # count = item.childCount()
    48. # if item.checkState(column) == Qt.CheckState.Checked:
    49. # for i in range(count):
    50. # if item.child(i).checkState(0) != Qt.CheckState.Checked:
    51. # item.child(i).setCheckState(0,Qt.CheckState.Checked)
    52. #
    53. # if item.checkState(column) == Qt.CheckState.Unchecked:
    54. # for i in range(count):
    55. # if item.child(i).checkState(0) != Qt.CheckState.Unchecked:
    56. # item.child(i).setCheckState(0,Qt.CheckState.Unchecked)
    57. def updateParentItems(self,item,column):
    58. parent = item.parent()
    59. if parent == None: return
    60. parent.setCheckState(column, item.checkState(column))
    61. count = parent.childCount()
    62. for i in range(count):
    63. child = parent.child(i)
    64. if child.checkState(column) != parent.checkState(column):
    65. parent.setCheckState(column, Qt.CheckState.PartiallyChecked)
    66. break
    67. self.updateParentItems(parent, column)
    68. def updateChildItems(self, item, column):
    69. count = item.childCount()
    70. for i in range(count):
    71. child = item.child(i)
    72. child.setCheckState(column,item.checkState(column))
    73. if child.childCount() > 0:
    74. self.updateChildItems(child, column)
    75. def handleChanged(self, item, column):
    76. # 注意,一定要先设置子节点,在设置父节点,不然现象比较奇怪
    77. self.updateChildItems(item, column)
    78. self.updateParentItems(item, column)
    79. self.GetSelectedNode(item, column)
    80. def GetSelectedNode(self,item, column):
    81. iterator = QTreeWidgetItemIterator(item)
    82. while iterator.value():
    83. item = iterator.value()
    84. # print(item.parent())
    85. if item.checkState(column) == Qt.CheckState.Checked:
    86. print(item.text(column))
    87. pass
    88. iterator +=1
    89. def traverse(self):
    90. """遍历节点"""
    91. n = self.treeWidget.topLevelItemCount() # 获取根节点数量
    92. for i in range(0, n):
    93. item = self.treeWidget.topLevelItem(i) # 循环获取根节点
    94. text = item.text(0) # 根节点文字信息(默认一列)
    95. count = item.childCount() # 获取当前根节点的子节点数量
    96. if count != 0:
    97. for j in range(0, count):
    98. string = item.child(j).text(0) # 子节点的文字信息
    99. print(string)
    100. def Listener(self):
    101. # 按钮的信号槽连接
    102. self.pushButton_add.clicked.connect(self.addTreeNodeBtn)
    103. self.pushButton_del.clicked.connect(self.delTreeNodeBtn)
    104. self.pushButton_modify.clicked.connect(self.updateTreeNodeBtn)
    105. def onTreeClicked(self, qmodelindex):
    106. item = self.tree.currentItem()
    107. print("key=%s ,value=%s" % (item.text(0), item.text(1)))
    108. def addTreeNodeBtn(self):
    109. item = self.tree.currentItem()
    110. print(item.parent(), item.childCount())
    111. node = QTreeWidgetItem(item)
    112. node.setText(0, 'newNode')
    113. node.setText(1, '10')
    114. def updateTreeNodeBtn(self):
    115. print('--- updateTreeNodeBtn ---')
    116. item = self.tree.currentItem()
    117. item.setText(0, 'updateNode')
    118. item.setText(1, '20')
    119. def delTreeNodeBtn(self):
    120. print('--- delTreeNodeBtn ---')
    121. item = self.tree.currentItem()
    122. root = self.tree.invisibleRootItem()
    123. for item in self.tree.selectedItems():
    124. (item.parent() or root).removeChild(item)
    125. if __name__ == '__main__':
    126. app = QApplication(sys.argv)
    127. tree = TreeWidgetDemo()
    128. tree.show()
    129. sys.exit(app.exec())
    1. [中国]
    2. node1 = 北京
    3. node2 = 上海
    4. node3 = 重庆
    5. node4 = 天津
    6. node5 = 广东
    7. [广东]
    8. node1 = 广州
    9. node2 = 深圳
    10. node3 = 东莞
    11. [贵州]
    12. node1 = 贵阳
    13. node2 = 遵义
    14. node3 = 安顺

  • 相关阅读:
    C++ Reference: Standard C++ Library reference: C Library: cstdio: fgets
    【SpringBoot集成Redis + Session持久化存储到Redis】
    halcon 算子shape_trans
    快速排序法
    Redis高可用系列——List类型
    EXCEL表格倒三角标志下拉选择的设置、取消限制方法
    Docker笔记-08 Docker BuildKit
    pxe网络装机
    大数据测试-数据质量模型
    六大排序(插入排序、希尔排序、冒泡排序、选择排序、堆排序、快速排序)未完
  • 原文地址:https://blog.csdn.net/u013416923/article/details/133780636