嘿,我一直在通过这个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()的作用吗?感谢。
答案 0 :(得分:16)
该教程严重过时。自Qt 4.3以来,QDrag.start
已过时。应该使用QDrag.exec_
。
正如您从exec
的文档中看到的那样,它具有返回值。 setDropAction
中的dropEvent
确定此值。它没有执行此举。这就是为什么你需要self.button.move()
进行实际移动的原因。那么,setDropAction
有什么意义呢?您可能需要知道您执行的拖动操作类型。想象一下,您正在两个列表小部件之间实现拖放。如果您执行了移动操作,则意味着您需要从源窗口小部件中删除该项目并在目标中创建一个项目。如果是复制操作,您可以保留原始文件并在目标中创建副本。
setHotSpot
/ hotSpot
与setPixmap
的{{1}}相关。拖动项目时可以显示QDrag
。 QPixmap
确定像素图的定位。 pixmap的位置使得光标相对于像素图的左上角位于hotSpot
。因此,在该教程的情况下,它是没有意义的,因为没有像素图显示。
以下是该教程的一些修改和更新版本。希望我收到足够的评论。您可以使用hotSpot
移动或使用Right-Click
复制:
Shift + Right-Click
答案 1 :(得分:1)
Avaris的回答适用于PyQt5和Python 3。
sendAction()