PyQt5中如何获取QDragLeaveEvent的退出位置?
解决PyQt5中QDragLeaveEvent无法获取退出位置的问题
你遇到的问题核心原因很明确:QDragLeaveEvent本身并没有提供pos()方法。和dragEnterEvent接收的QDragEnterEvent不同,QDragLeaveEvent继承自基础的QEvent类,它不包含鼠标位置相关的属性,直接调用类似event.pos()自然会报错。
要获取拖拽退出时的位置,我们可以通过跟踪最后一次拖拽移动的坐标来实现,具体步骤和代码示例如下:
- 在你的QWidget子类中添加一个成员变量,用来存储最后一次拖拽移动的坐标
- 重写
dragMoveEvent方法,每次拖拽移动时更新这个坐标 - 在
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
相关产品推荐
相关产品推荐

