继承QTreeWidget
- 设置QTreeWidget的拖拽模式为
InternalMove
- 设置允许拖拽
self.setDragEnabled(True)
class TreeWidget(QTreeWidget):
def __init__(self):
super(TreeWidget, self).__init__()
self.setDragDropMode(QTreeWidget.InternalMove)
self.setDragEnabled(True)
添加item
在添加item
时要设置item
的type
属性,同时要设置item
的flags
item1 = QTreeWidgetItem(self, type=Level.LEVEL1)
...
item11 = QTreeWidgetItem(item1, type=Level.LEVEL2)
item11.setFlags(item11.flags() & ~Qt.ItemIsDropEnabled)
知识点:
- 设置多个flag:
setFlags(item1.flags() | Qt.ItemIsDragEnabled)
- 删除一个flag:
setFlags(item1.flags() & ~Qt.ItemIsDragEnabled)
重构拖拽移动事件
限制只能拖拽在相同的一级item
中进行拖拽
def dragMoveEvent(self, event):
current_item = self.currentItem()
item = self.itemAt(event.pos())
if item and item.type() == Level.LEVEL2 and current_item.parent() == item.parent():
# item不为空;item是第二级item;当前current_item和光标所在item的父级item相同
super(TreeWidget, self).dragMoveEvent(event)
else:
event.ignore()
重构放下事件
原理和拖拽移动事件一样
def dropEvent(self,event) -> None:
current_item = self.currentItem()
item = self.itemAt(event.pos())
if item and item.type() == Level.LEVEL2 and current_item.parent() == item.parent():
super(TreeWidget, self).dropEvent(event)
else:
event.ignore()
最终效果
源码下载:戳这里