pyqt5 实现拖拽的另一种方法(不重写类)

前言:

最近在自学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()

你可能感兴趣的:(pyqt5 实现拖拽的另一种方法(不重写类))