In the first example, we have a QLineEdit and a QPushButton. We drag plain text from the line edit widget and drop it onto the button widget. The button's label will change.
我们可以把单行输入框中的文本选中后拖拉到按钮上,这样按钮的名字就会改变。
代码:
# coding='utf-8'
from PyQt5.QtWidgets import QApplication, QWidget,\
QPushButton, QLineEdit
import sys
# 因为实现拖拉改变button的标签会很复杂,我们需要重写好几个函数,\
# 所以这里为了方便我们直接写了个自己的类继承自QPushButton
class Button(QPushButton):
# 注意继承的子类也需要重写构造函数,需要参数标题和父组件
def __init__(self, title, parent):
# 利用得到的title和parent去初始化父类button
super(Button, self).__init__(title, parent)
# 这个很重要!!一定要将拖拉的接受者的setAcceptDrops变成True,\
# 才能接受从别的地方的拖拉操作的作用
self.setAcceptDrops(True)
# 重写的这个slot会在将别的组件拖动\
# 到我们这个按钮时触发(此时拖过来还没放下)
def dragEnterEvent(self, e) -> None:
# 此时刚刚拖到我们这个按钮上,但是还没放下,\
# 我们需要对拖过来的信息进行处理,\
# 由于我们需要改变按钮的标签内容,\
# 所以我们只能接受拖过来的文本,而不能是其他内容.
# e.mimeData()这个返回值是QMimeData对象,
# 这个对象的hasFomat方法可以判断内容格式是否是某一特定类型
if e.mimeData().hasFormat('text/plain'):
# 如果拖拽过来的是文本格式,就可以放上去(松手)
e.accept()
else:
# 如果拖过来的内容不是文本,就不接受,不能放置上去(不能松手)
e.ignore()
# 和这个对应:self.setAcceptDrops(True)
# 我们把setAcceptDrops变成True,\
# 所以我们的拖操作可以对button产生效果.\
# 而这个重写的函数就是重写button接收到拖过来的东西在它上面放手后\
# 的slot,这个事件要想触发,必须要dragEnterEvent事件能够接受.\
# 也就是拖过来还没松手,这时要接受了才能松手触发这个dropEvent slot
def dropEvent(self, e) -> None:
# 将按钮标签名设置为拖过来的文本
self.setText(e.mimeData().text())
class Gui(QWidget):
def __init__(self):
super(Gui, self).__init__()
self.start()
def start(self):
# 创建单行输入文本
edit = QLineEdit('', self)
# 这个很重要!! 必须要将edit的setDragEnabled设置为True\
# 我们才能从输入的文本中拖出它,不然是拖不出的.
edit.setDragEnabled(True)
edit.move(20, 65)
button = Button('按钮', self)
button.move(200, 65)
self.setGeometry(300, 300, 300, 150)
self.setWindowTitle('简单的拖和拉')
self.show()
app = QApplication(sys.argv)
gui = Gui()
sys.exit(app.exec_())
运行结果:
image.png
(先在文本框选中,然后将文字拖过去,按钮标签就改变了)
网友评论