前言:
最近在自学Pyqt5界面开发,想实现拖拽功能,网上查到的都是通过改写控件的类实现的。因为本人是菜鸟,所以界面是在Qt Designer下设计再生成py文件,如果改写类的话,更新ui时需要修改相应py文件,并且同一种拖拽功能,在不同控件上实现是需要重写一遍类,略显麻烦,所以想通过不采用改写类的方法实现拖拽功能,经过查找资料,到达预期目标。
参考文献:
1.改写实例方法:https://www.cnblogs.com/ly570/p/10942311.html
2.改写类实现拖拽功能:https://blog.csdn.net/chengmo123/article/details/93468426
代码示例:
说明:示例是在参考文献2(重新类的方法)上修改而来。
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class Example(QWidget):
def __init__(self):
super(Example, self).__init__()
self.initUI()
def initUI(self):
#表单布局,添加控件
lo=QFormLayout()
lo.addRow(QLabel('请把左边的文本拖曳到右边的下拉菜单中'))
#实例化单行文本框,设置为允许拖曳操作
edit=QLineEdit()
edit.setDragEnabled(True)
#实例化下拉框对象,添加控件到布局中
com = QComboBox()
com.setAcceptDrops(True)
com.dragEnterEvent = self.dragEnterEvent_com
com.dropEvent = lambda e :self.dropEvent_com(com,e)
lo.addRow(edit,com)
#设置主窗口布局及标题
self.setLayout(lo)
self.setWindowTitle('简单的拖曳例子')
#当执行一个拖曳控件操作,并且鼠标指针进入该控件时,这个事件将会被触发。
# 在这个事件中可以获得被操作的窗口控件,还可以有条件地接受或拒绝该拖曳操作
def dragEnterEvent_com(self,e):
#检测拖曳进来的数据是否包含文本,如有则接受,无则忽略
if e.mimeData().hasText():
e.accept()
else:
e.ignore()
#当拖曳操作在其目标控件上被释放时,这个事件将被触发
def dropEvent_com(self,object,e):
#添加拖曳文本到条目中
object.addItem(e.mimeData().text())
if __name__ == '__main__':
app=QApplication(sys.argv)
ex=Example()
ex.show()
sys.exit(app.exec_())
说明
将拖拽的动作放到窗体创建内,其实也可以独立成单独的函数。
通过重写实例方法的方式,修改指定空间的拖拽事件:
com.dragEnterEvent = self.dragEnterEvent_com
对于需要其他输入参数的方式,可以采用lambda函数实现:
com.dropEvent = lambda e :self.dropEvent_com(com,e)
小结
通过修改实例方法的方式,可以实现不重写类实现拖拽功能。
拖拽函数可以提高通用性。
额外说明
对于QListWidget类空间,为了实现拖拽添加元素的功能,响应dropEvent事件,除了需要设置dragEnterEvent时间外,还需要设置dragMoveEvent事件。
list.dragMoveEvent =self.dragMoveEvent_new
def dragMoveEvent_new(self,e):
e.accept()