You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 17:37:58