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

PyQt5中如何获取QDragLeaveEvent的退出位置?

解决PyQt5中QDragLeaveEvent无法获取退出位置的问题

你遇到的问题核心原因很明确:QDragLeaveEvent本身并没有提供pos()方法。和dragEnterEvent接收的QDragEnterEvent不同,QDragLeaveEvent继承自基础的QEvent类,它不包含鼠标位置相关的属性,直接调用类似event.pos()自然会报错。

要获取拖拽退出时的位置,我们可以通过跟踪最后一次拖拽移动的坐标来实现,具体步骤和代码示例如下:

  1. 在你的QWidget子类中添加一个成员变量,用来存储最后一次拖拽移动的坐标
  2. 重写dragMoveEvent方法,每次拖拽移动时更新这个坐标
  3. 在dragLeaveEvent中,直接使用之前存储的坐标作为退出位置
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtCore import Qt, QMimeData

class DraggableWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.last_drag_pos = None  # 用于存储最后一次拖拽的位置

    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat("text/plain"):
            event.acceptProposedAction()
            print(f"Drag entered at: {event.pos()}")

    def dragMoveEvent(self, event):
        if event.mimeData().hasFormat("text/plain"):
            event.acceptProposedAction()
            self.last_drag_pos = event.pos()  # 每次拖拽移动时更新位置

    def dragLeaveEvent(self, event):
        if self.last_drag_pos is not None:
            print(f"Drag left at: {self.last_drag_pos}")
            self.last_drag_pos = None  # 重置位置,避免后续无关事件干扰

if __name__ == "__main__":
    app = QApplication([])
    widget = DraggableWidget()
    widget.setFixedSize(300, 300)
    widget.setAcceptDrops(True)
    widget.show()
    app.exec_()

需要注意的细节:

  • 确保dragMoveEvent中调用了event.acceptProposedAction(),否则拖拽移动事件不会持续触发,也就无法跟踪位置
  • 在dragLeaveEvent处理完成后重置last_drag_pos,防止下次拖拽时读取到上一次的残留位置

这样就能完美获取拖拽退出时的位置啦!

内容的提问来源于stack exchange,提问作者K.Mulier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:20:00