嘿,我一直在阅读本教程,以了解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.start
从Qt 4.3开始已经过时了。QDrag.exec_
应该改为使用。
从的文档中可以看到exec
,它具有返回值。setDropAction
indropEvent
确定此值。它不执行移动。这就是为什么您需要进行self.button.move()
实际移动的原因。那么,a的意义是setDropAction
什么?您可能需要知道您执行了哪种拖动操作。假设您要在两个列表小部件之间实现拖放。如果执行了移动操作,则意味着您需要从源窗口小部件中删除该项目,然后在目标中创建一个项目。如果是复制操作,则可以保留原件,而只需在目标中创建一个副本。
setHotSpot
/hotSpot
是有关setPixmap
的QDrag
。QPixmap
拖动项目时可以显示一个。hotSpot
确定像素图的位置。像素图的位置将使光标位于hotSpot
相对于像素图的左上角。因此,在该教程的情况下,由于没有要显示的像素图,因此毫无意义。
这是该教程的一些修改和更新的版本。希望我已经包含了足够的评论。你可以 移动 使用Right-Click
或 复制 有Shift + Right- Click
:
#!/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_()
问题内容: 我一直在编码OCR书籍扫描程序(它通过读取页码来重命名页面),并且已经从基本的CLI Python脚本切换到GUI。 我正在使用PyQT4并拖放查看大量文档,但是没有运气。它只是拒绝接收那些文件!我将这些用于我的UI设计文章: http://tech.xster.net/tips/pyqt-drag-images-into-list-widget-for-thumbnail-list/
本文向大家介绍pyqt 安装PyQt4,包括了pyqt 安装PyQt4的使用技巧和注意事项,需要的朋友参考一下 示例 建议的安装方法 Windows:下载并运行二进制安装文件。 Linux(Debian):在命令行中运行以下命令: OS X:在命令行中运行以下命令: 手动安装 您也可以从此处手动下载源代码,然后自己安装和配置它。 测试您的安装 如果正确安装了pyqt,则可以运行该pyuic4命令。
问题内容: 我安装了可正常运行的python 2.6,并且刚刚安装了为python 2.6构建的PyQt4(可从http://www.riverbankcomputing.co.uk/software/pyqt/download下载)。当我尝试导入PyQt4.QtGui时,出现以下错误: 我使用的是Windows 2k8 64位,但我的Python安装是32位。 问题答案: 将包含Qt应用程序和D
问题内容: 有没有办法最小化PyQt4中的托盘?我已经使用过QSystemTrayIcon类,但是现在我想最小化或“隐藏”我的应用程序窗口,并仅显示任务栏图标。 有人这样做吗?任何方向将不胜感激。 在Window XP Pro上使用Python 2.5.4和PyQt4 问题答案: 一旦您记住没有办法真正最小化系统托盘,这将非常简单。 而是通过执行以下操作来伪造它: 在窗口上捕获最小化事件 在最小化
问题内容: 对于这个问题,我很抱歉,但是我已经阅读了很多东西,而且看来我还不懂如何做一个计时器。所以我发布我的代码: 我正在尝试使该对象每200毫秒朝目标移动一次。我没有自我尝试过,它给了我同样的错误: 我不知道如何将计时器连接到带有参数的函数。我以为我没有正确使用SLOT参数,但这给了我这些错误。我想这都是错的。我将不胜感激:) 问题答案: 使用新样式的信号,它们更容易理解。 交换- 与- 一个
问题内容: 在PyQt4网站上,他们安装软件包的说明是下载tarball并使用配置文件。我有两个版本的Python,一个是我的普通系统,另一个在anaconda内。我不确定如何在anaconda中安装它。是否有conda命令安装PyQt4? 问题答案: 费耶 PyQt现在可通过conda在所有平台上使用! 用得到这些#Python绑定Qt框架。@ 1:02 PM-2014年5月1日 https:/