PyQt5如何捕获QTreeWidgetItem双击事件并响应指定节点
PyQt5 QTreeWidget 节点双击定制逻辑实现
核心实现逻辑
- 双击事件触发时先定位点击位置对应的树节点,未命中节点直接退出
- 通过判断节点是否存在子节点,过滤掉
А1、qqq这类父级节点,不触发任何操作 - 用字典维护节点文本和对应执行逻辑的映射关系,后续扩展新节点的触发逻辑只需要往映射表新增条目即可,无需改动事件判断的核心代码
- 仅当双击的是无下级子项的叶子节点、且文本匹配映射表中的键时,才执行对应的绑定逻辑
完整可运行代码
import sys from PyQt5 import QtWidgets, QtCore, QtGui class FirstInstance(QtWidgets.QTreeWidget): def __init__(self): super().__init__() self.setHeaderHidden(True) self.setGeometry(300, 300, 700, 500) # 构建树形结构 root_node = QtWidgets.QTreeWidgetItem(self, ['А1']) mid_node = QtWidgets.QTreeWidgetItem(root_node, ['qqq']) # 批量创建叶子节点 for text in ['1','8','4','9','2','5','7']: QtWidgets.QTreeWidgetItem(mid_node, [text]) # 节点-执行逻辑映射表,后续扩展直接往这里加键值对即可 self.node_action_map = { "2": self.event_for_node2, "8": self.event_for_node8 # 后续扩展示例:"1": OtherClass.target_method } def event_for_node2(self): """文本为"2"的节点双击触发逻辑""" print("触发节点2对应的事件") def event_for_node8(self): """文本为"8"的节点双击触发逻辑""" print("触发节点8对应的事件") def mouseDoubleClickEvent(self, event): # 保留父类原生双击逻辑 super().mouseDoubleClickEvent(event) # 获取双击坐标对应的节点 click_item = self.itemAt(event.pos()) # 未点到节点直接返回 if not click_item: return # 存在子节点的是父级节点,直接跳过 if click_item.childCount() > 0: return # 读取节点第一列文本,匹配对应逻辑执行 node_text = click_item.text(0) if node_text in self.node_action_map: self.node_action_map[node_text]() if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) window = FirstInstance() window.setWindowTitle("Window") window.show() sys.exit(app.exec_())
扩展说明
后续新增其他节点的触发逻辑只需要两步:
- 编写对应处理函数,或引入其他类中已经实现的目标方法
- 往
self.node_action_map字典中新增键为节点文本、值为对应方法的条目即可,不需要修改mouseDoubleClickEvent内的判断逻辑,维护成本低。
如果存在不同父节点下同文本节点需要触发不同逻辑的场景,可以给节点通过
setData方法绑定自定义唯一标识,匹配时读取自定义标识做判断即可,无需依赖文本匹配。
内容的提问来源于stack exchange,提问作者Андрей
相关产品推荐
相关产品推荐

