TreeWidget.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. from typing import Optional
  2. from PyQt5.QtCore import Qt
  3. from PyQt5.QtWidgets import QTreeWidget, QTreeWidgetItem
  4. from .PostgreSQL import PostgreSQL
  5. class Tree:
  6. type = ""
  7. def __init__(self, type: Optional[str] = ''):
  8. self.type = type
  9. def createTree(self, data, parent, parentid):
  10. """递归创建树形结构"""
  11. # 先获取当前层级的所有节点并按sort排序
  12. current_level_nodes = []
  13. for row in data:
  14. if (parentid == '' and row['pbsm'] == '') or (row['pbsm'] == parentid):
  15. current_level_nodes.append(row)
  16. # 按sort字段排序
  17. current_level_nodes.sort(key=lambda x: int(x['sort']) if x['sort'] is not None else 9999)
  18. # 创建当前层级的节点
  19. for row in current_level_nodes:
  20. item = QTreeWidgetItem(parent)
  21. item.setText(0, row['name']) # 第0列:名称
  22. item.setText(1, row['bsm']) # 第1列:唯一ID
  23. # 设置第2列:图层类型(如 vector、raster)或目录的 pbsm
  24. if 'layertype' in row and row['layertype']:
  25. item.setText(2, row['layertype']) # 数据节点
  26. else:
  27. item.setText(2, row['pbsm']) # 目录节点
  28. # 用于排序显示
  29. item.setData(0, Qt.UserRole + 1, int(row['sort']) if row['sort'] is not None else 9999)
  30. # 递归创建子节点
  31. self.createTree(data, item, row['bsm'])
  32. def initTreeWidget(self, dbcoon):
  33. """初始化QTreeWidget"""
  34. try:
  35. print("初始化 QTreeWidget...")
  36. tree = QTreeWidget()
  37. tree.setStyleSheet("QTreeView::item{padding: 2px;}")
  38. tree.setColumnCount(3)
  39. tree.setColumnHidden(1, True)
  40. tree.setColumnHidden(2, True)
  41. tree.setObjectName(self.type)
  42. tree.setHeaderLabels(["名称", "实体数据名称", "数据类型"])
  43. tree.headerItem().setHidden(True)
  44. print("准备连接数据库...")
  45. pg = PostgreSQL(schema=dbcoon["schema"], host=dbcoon["host"],
  46. port=dbcoon["port"],
  47. user=dbcoon["user"],
  48. password=dbcoon["password"],
  49. dbname=dbcoon["dbname"])
  50. print("数据库连接成功")
  51. print("获取资源目录数据...")
  52. treedata = pg.getZyml() # 你需要确保这里返回的数据中包含 layertype 字段
  53. print(f"资源目录数据数量: {len(treedata)}")
  54. self.createTree(treedata, tree, "")
  55. print("树结构创建成功")
  56. pg.close()
  57. print("数据库连接关闭")
  58. return tree
  59. except Exception as e:
  60. import traceback
  61. print("initTreeWidget 初始化失败:", e)
  62. print(traceback.format_exc())
  63. raise e # 抛出给外层捕获