PyQt4 - 拖放

时间:2013-01-18 09:23:07

标签: python qt button drag-and-drop pyqt4

嘿,我一直在通过这个tutorial来理解PyQt4中的拖放方法。但是我无法理解以下几点。如果somepne可以让我更清楚,那就太好了。

 def mouseMoveEvent(self, e): //class Button


    mimeData = QtCore.QMimeData()

    drag = QtGui.QDrag(self)
    drag.setMimeData(mimeData)
    drag.setHotSpot(e.pos() - self.rect().topLeft())

    dropAction = drag.start(QtCore.Qt.MoveAction)

def dropEvent(self, e): //class Example

    position = e.pos()
    self.button.move(position)

    e.setDropAction(QtCore.Qt.MoveAction)
    e.accept()

为什么有一个单独的self.button.move()和e.setDropAction()不是self.button.move()实际上移动按钮本身?有人可以解释一下drag.setHotSpot和drag.start()的作用吗?感谢。

2 个答案:

答案 0 :(得分:16)

该教程严重过时。自Qt 4.3以来,QDrag.start已过时。应该使用QDrag.exec_

正如您从exec的文档中看到的那样,它具有返回值。 setDropAction中的dropEvent确定此值。它没有执行此举。这就是为什么你需要self.button.move()进行实际移动的原因。那么,setDropAction有什么意义呢?您可能需要知道您执行的拖动操作类型。想象一下,您正在两个列表小部件之间实现拖放。如果您执行了移动操作,则意味着您需要从源窗口小部件中删除该项目并在目标中创建一个项目。如果是复制操作,您可以保留原始文件并在目标中创建副本。

setHotSpot / hotSpotsetPixmap的{​​{1}}相关。拖动项目时可以显示QDragQPixmap确定像素图的定位。 pixmap的位置使得光标相对于像素图的左上角位于hotSpot。因此,在该教程的情况下,它是没有意义的,因为没有像素图显示。

以下是该教程的一些修改和更新版本。希望我收到足够的评论。您可以使用hotSpot 移动或使用Right-Click 复制

Shift + Right-Click

答案 1 :(得分:1)

Avaris的回答适用于PyQt5和Python 3。

sendAction()