Qt TreeView禁用父节点拖放及子节点ToolTip实现问询
QTreeView拖放限制与子节点ToolTip实现方案
一、限制仅子节点可拖放
问题核心是在模型的flags()方法中按节点类型过滤拖拽权限,具体修改如下:
- 在自定义树模型的
flags()方法内,获取当前索引对应的TreeNode对象 - 判断节点是否为父节点(可通过节点是否是顶层节点,或
TreeNode自身的标识属性) - 父节点移除
Qt.ItemIsDragEnabled标志,子节点保留/添加该标志
示例代码:
from PyQt5.QtCore import Qt, QAbstractItemModel, QModelIndex class TreeModel(QAbstractItemModel): # ... 其他已有代码 ... def flags(self, index): base_flags = super().flags(index) if not index.isValid(): return base_flags node = index.internalPointer() # 两种判断父节点的方式二选一: # 方式1:TreeNode有is_parent属性时直接判断 if node.is_parent: # 方式2:通过索引判断是否为顶层节点(直接属于根节点) # if index.parent() == self.index(-1, -1): # 父节点禁止拖拽 base_flags &= ~Qt.ItemIsDragEnabled else: # 子节点允许拖拽 base_flags |= Qt.ItemIsDragEnabled # 保留必要的其他标志(如可选择、可接收拖放) base_flags |= Qt.ItemIsSelectable | Qt.ItemIsDropEnabled return base_flags
二、给子节点添加自定义ToolTip
TreeNode没有setToolTip属性,直接在模型的data()方法中处理Qt.ToolTipRole请求即可:
- 在
data()方法中捕获Qt.ToolTipRole请求 - 判断当前节点是子节点时,返回自定义提示文本
示例代码:
class TreeModel(QAbstractItemModel): # ... 其他已有代码 ... def data(self, index, role=Qt.DisplayRole): if not index.isValid(): return None node = index.internalPointer() if role == Qt.DisplayRole: return node.text elif role == Qt.ToolTipRole: # 仅给子节点返回自定义ToolTip,判断逻辑同拖放限制 if not node.is_parent: # if index.parent() != self.index(-1, -1): return f"子节点:{node.text}\n自定义描述内容" # 其他角色交给父类处理 return super().data(index, role)
补充说明
如果你的TreeNode没有is_parent属性,用index.parent() == self.index(-1, -1)判断顶层节点(即你所说的"Parent-0/1/2")是最直接的方式,它们的子节点就是需要允许拖放和添加ToolTip的对象。
内容的提问来源于stack exchange,提问作者BadRobot
相关产品推荐
相关产品推荐

