gpt4 book ai didi

python - PyQt4 - 拖放

转载 作者:太空狗 更新时间:2023-10-29 19:37:46 25 4
gpt4 key购买 nike

嘿,我一直在经历这个tutorial用于理解 PyQt4 中的拖放方法。但是我无法理解以下几点。如果有人能让我更清楚,那就太好了。

 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() 的作用吗?谢谢。

最佳答案

该教程已经严重过时了。 QDrag.startQt 4.3 以来已过时. QDrag.exec_应该改用。

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

setHotSpot/hotSpotQDragsetPixmap有关。您可以在拖动项目时显示 QPixmaphotSpot 确定像素图的位置。像素图的定位使得光标位于相对于像素图左上角的 hotSpot 处。因此,就该教程而言,它毫无意义,因为没有要显示的像素图。

这是该教程的一些修改和更新版本。希望我已经包含了足够的评论。您可以使用右键单击移动或使用Shift + 右键单击​​复制:

#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore


class Button(QtGui.QPushButton):
def mouseMoveEvent(self, e):
if e.buttons() != QtCore.Qt.RightButton:
return

# write the relative cursor position to mime data
mimeData = QtCore.QMimeData()
# simple string with 'x,y'
mimeData.setText('%d,%d' % (e.x(), e.y()))

# let's make it fancy. we'll show a "ghost" of the button as we drag
# grab the button to a pixmap
pixmap = QtGui.QPixmap.grabWidget(self)

# below makes the pixmap half transparent
painter = QtGui.QPainter(pixmap)
painter.setCompositionMode(painter.CompositionMode_DestinationIn)
painter.fillRect(pixmap.rect(), QtGui.QColor(0, 0, 0, 127))
painter.end()

# make a QDrag
drag = QtGui.QDrag(self)
# put our MimeData
drag.setMimeData(mimeData)
# set its Pixmap
drag.setPixmap(pixmap)
# shift the Pixmap so that it coincides with the cursor position
drag.setHotSpot(e.pos())

# start the drag operation
# exec_ will return the accepted action from dropEvent
if drag.exec_(QtCore.Qt.CopyAction | QtCore.Qt.MoveAction) == QtCore.Qt.MoveAction:
print 'moved'
else:
print 'copied'


def mousePressEvent(self, e):
QtGui.QPushButton.mousePressEvent(self, e)
if e.button() == QtCore.Qt.LeftButton:
print 'press'



class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()


def initUI(self):
self.setAcceptDrops(True)

button = Button('Button', self)
button.move(100, 65)

self.buttons = [button]

self.setWindowTitle('Copy or Move')
self.setGeometry(300, 300, 280, 150)


def dragEnterEvent(self, e):
e.accept()


def dropEvent(self, e):
# get the relative position from the mime data
mime = e.mimeData().text()
x, y = map(int, mime.split(','))

if e.keyboardModifiers() & QtCore.Qt.ShiftModifier:
# copy
# so create a new button
button = Button('Button', self)
# move it to the position adjusted with the cursor position at drag
button.move(e.pos()-QtCore.QPoint(x, y))
# show it
button.show()
# store it
self.buttons.append(button)
# set the drop action as Copy
e.setDropAction(QtCore.Qt.CopyAction)
else:
# move
# so move the dragged button (i.e. event.source())
e.source().move(e.pos()-QtCore.QPoint(x, y))
# set the drop action as Move
e.setDropAction(QtCore.Qt.MoveAction)
# tell the QDrag we accepted it
e.accept()



if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_()

关于python - PyQt4 - 拖放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14395799/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com