extends Control ## 测试数据:模拟 sect_data 里的嵌套资源(分类 → 子项) var test_resources := [ {"name": "粮草", "items": [{"name": "米", "quantity": 10}, {"name": "蔬菜", "quantity": 20}]}, {"name": "丹药", "items": [{"name": "聚气丹", "quantity": 5}]}, ] func _ready() -> void: var tree: Tree = $ScrollContainer/Tree tree.hide_root = true # 隐藏内部根,顶部就是"粮草/丹药" tree.columns = 2 tree.item_selected.connect(_on_item_selected) _refresh(tree) pass ## 每次数据变化后全量重建(简单可靠) func _refresh(tree: Tree) -> void: tree.clear() for category: Dictionary in test_resources: var cat_item := tree.create_item() # 无父 = 顶级项(挂在隐藏根下) cat_item.set_text(0, category["name"]) cat_item.set_metadata(0, {"type": "category"}) for sub: Dictionary in category["items"]: var item := tree.create_item(cat_item) # 子项 item.set_text(0, sub["name"]) item.set_text(1, str(sub["quantity"])) item.set_metadata(0, sub) # 存整条数据便于取用 ## 动态新增一项后刷新 func _on_add_button() -> void: # 测试:手动调一次 test_resources[0]["items"].append({"name": "灵米", "quantity": 99}) _refresh($ScrollContainer/Tree) func _on_item_selected() -> void: var tree: Tree = $ScrollContainer/Tree var selected := tree.get_selected() if selected != null: print(selected.get_text(0), " → ", selected.get_metadata(0))