在PyQt4教程的这一部分中,我们将讨论拖放操作。
在计算机图形用户界面中,拖放是点击虚拟对象并将其拖动到不同位置或另一虚拟对象上的动作(或对该动作的支持)。一般来说,它可以用来调用许多类型的操作,或者在两个抽象对象之间创建各种类型的关联。
拖放是图形用户界面的一部分。拖放操作使用户能够直观地完成复杂的操作。
通常,我们可以拖放两件事:数据或一些图形对象。如果我们将图像从一个应用程序拖到另一个应用程序,我们拖放二进制数据。如果我们在Firefox中拖动一个标签并将其移动到另一个地方,我们将拖放一个图形组件。
简单的拖放
在第一个例子中,我们有一个QtGui.QLineEdit和一个QtGui.QPushButton。我们将纯文本从行编辑小部件拖放到按钮小部件上。按钮的标签将更改。
#!/usr/bin/python
"""
ZetCode PyQt4 tutorial
This is a simple drag and
drop example.
author: Jan Bodnar
website: zetcode.com
last edited: January 2015
"""
import sys
from PyQt4 import QtGui
class Button(QtGui.QPushButton):
def __init__(self, title, parent):
super(Button, self).__init__(title, parent)
self.setAcceptDrops(True)
def dragEnterEvent(self, e):
if e.mimeData().hasFormat('text/plain'):
e.accept()
else:
e.ignore()
def dropEvent(self, e):
self.setText(e.mimeData().text())
class Example(QtGui.QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
edit = QtGui.QLineEdit('', self)
edit.setDragEnabled(True)
edit.move(30, 65)
button = Button("Button", self)
button.move(190, 65)
self.setWindowTitle('Simple drag & drop')
self.setGeometry(300, 300, 300, 150)
def main():
app = QtGui.QApplication(sys.argv)
ex = Example()
ex.show()
app.exec_()
if __name__ == '__main__':
main()
该示例展示了一个简单的拖放操作。
class Button(QtGui.QPushButton):
def __init__(self, title, parent):
super(Button, self).__init__(title, parent)
为了在QtGui.QPushButton小部件上删除文本,我们必须重新实现一些方法。因此,我们创建了自己的Button类,它继承自QtGui.QPushButton类。
self.setAcceptDrops(True)
我们为小部件启用放置事件。
def dragEnterEvent(self, e):
if e.mimeData().hasFormat('text/plain'):
e.accept()
else:
e.ignore()
首先,我们重新实现dragEnterEvent方法。我们通知我们接受的数据类型。在我们的例子中,它是纯文本。
def dropEvent(self, e):
self.setText(e.mimeData().text())
通过重新实现dropEvent方法,我们定义了在drop事件上要做的事情。这里我们更改按钮小部件的文本。
edit = QtGui.QLineEdit('', self)
edit.setDragEnabled(True)
QLineEdit小部件内置了对拖动操作的支持。我们需要做的就是调用setDragEnabled方法来激活它。
拖放按钮小部件
在下面的例子中,我们将演示如何拖放按钮小部件。
#!/usr/bin/python
"""
ZetCode PyQt4 tutorial
In this program, we can press on a button
with a left mouse click or drag and drop the
button with the right mouse click.
author: Jan Bodnar
website: zetcode.com
last edited: October 2013
"""
import sys
from PyQt4 import QtCore, QtGui
class Button(QtGui.QPushButton):
def __init__(self, title, parent):
super(Button, self).__init__(title, parent)
def mouseMoveEvent(self, e):
if e.buttons() != QtCore.Qt.RightButton:
return
mimeData = QtCore.QMimeData()
drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
drag.setHotSpot(e.pos() - self.rect().topLeft())
dropAction = drag.start(QtCore.Qt.MoveAction)
def mousePressEvent(self, e):
super(Button, self).mousePressEvent(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)
self.button = Button('Button', self)
self.button.move(100, 65)
self.setWindowTitle('Click or Move')
self.setGeometry(300, 300, 280, 150)
self.show()
def dragEnterEvent(self, e):
e.accept()
def dropEvent(self, e):
position = e.pos()
self.button.move(position)
e.setDropAction(QtCore.Qt.MoveAction)
e.accept()
def main():
app = QtGui.QApplication([])
ex = Example()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
在我们的代码示例中,窗口上有一个QtGui.QPushButton。如果我们用鼠标左键单击按钮,则“press”消息将打印到控制台。通过右键单击并移动按钮,我们在按钮小部件上执行拖放操作。
class Button(QtGui.QPushButton):
def __init__(self, title, parent):
super(Button, self).__init__(title, parent)
我们创建一个Button类,它将从QtGui.QPushButton派生。我们还重新实现了QtGui.QPushButton的两个方法:mouseMoveEvent和mousePressEvent。mouseMoveEvent方法是拖放操作开始的地方。
if event.buttons() != QtCore.Qt.RightButton:
return
这里我们决定只使用鼠标右键来执行拖放操作。鼠标左键保留用于单击按钮。
mimeData = QtCore.QMimeData()
drag = QtGui.QDrag(self)
drag.setMimeData(mimeData)
drag.setHotSpot(event.pos() - self.rect().topLeft())
将创建QDrag对象。该类支持基于MIME的拖放数据传输。
dropAction = drag.start(QtCore.Qt.MoveAction)
拖动对象的start方法启动拖放操作。
def mousePressEvent(self, e):
super(Button, self).mousePressEvent(e)
if e.button() == QtCore.Qt.LeftButton:
print 'press'
如果我们用鼠标左键单击按钮,我们会将“press”打印到控制台。请注意,我们也在父对象上调用mousePressEvent方法。否则,我们不会看到按钮被按下。
position = e.pos()
self.button.move(position)
在dropEvent方法中,我们编写了释放鼠标按钮并完成放置操作后发生的事情。我们找出当前鼠标指针的位置并相应地移动按钮。
e.setDropAction(QtCore.Qt.MoveAction)
e.accept()
我们指定放置动作的类型。在我们的例子中,它是一个移动动作。
PyQt4教程的这一部分专门用于拖放操作。