PyQt6 QTreeView重写拖拽事件后恢复拖放指示器显示的方法
PyQt6 QTreeView重写拖拽事件后恢复拖放指示器显示的方法
嗨,这个问题我碰到过~当你重写dragMoveEvent这类拖拽事件方法时,QTreeView默认负责绘制拖放指示器的逻辑被覆盖了,所以那条指示线就消失了。这里有几个简单的调整,帮你把它找回来:
关键调整1:在dragMoveEvent中调用父类的实现
默认的QTreeView.dragMoveEvent方法会自动计算拖放位置、绘制那条指示线,但你重写这个方法后,这部分逻辑不会自动执行了。所以在你自己的判断逻辑之后,一定要显式调用父类的方法:
def dragMoveEvent(self, event): if event.mimeData().hasFormat('application/x-item'): event.acceptProposedAction() # 调用父类方法,让它处理拖放指示器的绘制逻辑 super().dragMoveEvent(event) else: event.ignore()
关键调整2:在startDrag中指定明确的拖放动作
原来的drag.exec(event)没有指定具体的拖放动作,父类的指示器逻辑需要明确知道允许的动作类型(比如移动、复制),所以改成指定具体的动作:
def startDrag(self, event): selected_indexes = self.selectedIndexes() if selected_indexes: selected_item = self.model.itemFromIndex(selected_indexes[0]) mime_data = QtCore.QMimeData() data = QtCore.QByteArray() stream = QtCore.QDataStream(data, QtCore.QDataStream.OpenModeFlag.WriteOnly) stream.writeQString(selected_item.text()) mime_data.setData('application/x-item', data) drag = QtGui.QDrag(self) drag.setMimeData(mime_data) # 指定移动动作,你也可以根据需求换成CopyAction等 drag.exec(QtCore.Qt.DropAction.MoveAction)
为什么这样做?
- 调用父类的
dragMoveEvent能让QTreeView继续执行它原本的拖放位置计算和指示器绘制逻辑,不会因为你重写方法而丢失这部分功能。 - 指定明确的拖放动作,能让父类逻辑正确识别当前允许的操作,确保指示器正常显示。
修改完这两处之后,你再运行代码,拖动物体时应该就能看到那条指示你可以把元素放到哪里的线了~
备注:内容来源于stack exchange,提问作者slomo
相关产品推荐
相关产品推荐

