Python PyQt事件发生两次

Python PyQt事件发生两次,python,qt,pyqt,signals,Python,Qt,Pyqt,Signals,我正在尝试实现从QListWidget到QGraphicsView的拖放项。我从QGraphicsView继承了自己的类MooView,并封装了dragMove、dragEnter和drop事件。但在测试这一点时,我注意到每个事件都会出现两次 这是我的MooView代码: from PyQt4 import QtCore, QtGui class MooView(QtGui.QGraphicsView): def __init__(self, parent = None):

我正在尝试实现从
QListWidget
QGraphicsView
的拖放项。我从
QGraphicsView
继承了自己的类
MooView
,并封装了
dragMove
dragEnter
drop
事件。但在测试这一点时,我注意到每个事件都会出现两次

这是我的
MooView
代码:

from PyQt4 import QtCore, QtGui

class MooView(QtGui.QGraphicsView):
    def __init__(self, parent = None):
        QtGui.QGraphicsView.__init__(self, parent)

        self.handlers = {}

        self.handlers['dragEnter'] = []
        self.handlers['dragEnter'].append(super(MooView, self).dragEnterEvent)

        self.handlers['dragLeave'] = []
        self.handlers['dragLeave'].append(super(MooView, self).dragLeaveEvent)

        self.handlers['dragMove'] = []
        self.handlers['dragMove'].append(super(MooView, self).dragMoveEvent)

        self.handlers['drop'] = []
        self.handlers['drop'].append(super(MooView, self).dropEvent)

    def addDragEnterHandler(self, handler):
        self.handlers['dragEnter'].append(handler)

    def removeDragEnterHandler(self, handler):
        self.handlers['dragEnter'].remove(handler)

    def addDragLeaveHandler(self, handler):
        self.handlers['dragLeave'].append(handler)

    def removeDragLeaveHandler(self, handler):
        self.handlers['dragLeave'].remove(handler)

    def addDragMoveHandler(self, handler):
        self.handlers['dragMove'].append(handler)

    def removeDragMoveHandler(self, handler):
        self.handlers['dragMove'].remove(handler)

    def addDropHandler(self, handler):
        self.handlers['drop'].append(handler)

    def removeDropHandler(self, handler):
        self.handlers['drop'].remove(handler)

        # handlers

    def dragEnterEvent(self, arg):
        #res = super(MooView, self).dragEnterEvent(arg)

        for h in self.handlers['dragEnter']:
            h(arg)

        #return res

    def dragLeaveEvent(self, arg):
        #res = super(MooView, self).dragLeaveEvent(arg)

        for h in self.handlers['dragLeave']:
            h(arg)

        #return res

    def dragMoveEvent(self, arg):
        #res = super(MooView, self).dragMoveEvent(arg)

        for h in self.handlers['dragMove']:
            h(arg)

        #return res

    def dropEvent(self, arg):
        #res = super(MooView, self).dropEvent(arg)

        for h in self.handlers['drop']:
            h(arg)

        #return res
这就是我运行核心的方式:

import sys

from PyQt4 import QtCore, QtGui, QtOpenGL
from window import Ui_MainWindow

class Main(QtGui.QMainWindow):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.setWindowTitle('Hello, Qt!')

        self.scene = QtGui.QGraphicsScene()
        self.ui.workspace_view.setScene(self.scene)

        rect = QtCore.QRectF(0, 0, 1000, 1000)
        self.scene.setSceneRect(0, 0, rect.width(), rect.height())

        self.ui.workspace_view.setViewport(QtOpenGL.QGLWidget())

        icon = QtGui.QIcon(QtGui.QPixmap(":/Images/50.png"))
        text = "50's element"
        item = QtGui.QListWidgetItem(icon, text)
        self.ui.element_list.addItem(item)

        icon = QtGui.QIcon(QtGui.QPixmap(":/Images/40.png"))
        text = "40's element"
        item = QtGui.QListWidgetItem(icon, text)
        self.ui.element_list.addItem(item)

        self.ui.workspace_view.addDragEnterHandler(self.workspace_item_drag_enter)
        self.ui.workspace_view.addDragMoveHandler(self.workspace_item_drag_move)
        self.ui.workspace_view.addDropHandler(self.workspace_item_dropped)

    def workspace_item_drag_move(self, e):
        #print("item drag move")

        e.accept()

    def workspace_item_drag_enter(self, e):
        print("item drag enter")

        e.accept()

    def workspace_item_dropped(self, e):
        print("item dropped")

if (__name__ == "__main__"):
    app = QtGui.QApplication(sys.argv)
    myApp = Main()
    myApp.show()
    sys.exit(app.exec_())
拖放项目时,“项目拖放输入”和“项目拖放”行在终端中各打印两次,例如:

item drag enter 
item drag enter 
item dropped 
item dropped

问题是:如何修复它???

正如我在网上读到的,在某些情况下,
QGraphicsView
可以将事件传递给它的
qgraphicscene
。这里也是这样:当我从
qgraphicscene
继承我的类,并将其用作
QGraphicsView
的默认值时(将
MooView
替换为
QGraphicsView
;详细阅读此答案的其余部分),它按照我的预期工作

现在我有两个源代码部分:
moographicscene.py
main.py
。以下分别是:

from PyQt4 import QtCore, QtGui

class MooGraphicsScene(QtGui.QGraphicsScene):
    def __init__(self, parent = None):
        QtGui.QGraphicsScene.__init__(self, parent)

    def dragMoveEvent(selfs, e):
        pass

    def dropEvent(self, e):
        print("Drop fired!")

    def dragEnterEvent(self, e):
        e.accept()
        print("Drag entered!")
还有这个:

import sys

from PyQt4 import QtCore, QtGui, QtOpenGL
from window import Ui_MainWindow
from MooGraphicsScene import MooGraphicsScene

class Main(QtGui.QMainWindow):
    def __init__(self, parent = None):
        QtGui.QWidget.__init__(self, parent)

        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

        self.setWindowTitle('Hello, Qt!')

        # Setup Workspace
        self.scene = MooGraphicsScene()
        self.ui.workspace_view.setScene(self.scene)

        rect = QtCore.QRectF(0, 0, 1000, 1000)
        self.scene.setSceneRect(0, 0, rect.width(), rect.height())

        icon = QtGui.QIcon(QtGui.QPixmap(":/Images/50.png"))
        text = "50's element"
        item = QtGui.QListWidgetItem(icon, text)
        self.ui.element_list.addItem(item)

        icon = QtGui.QIcon(QtGui.QPixmap(":/Images/40.png"))
        text = "40's element"
        item = QtGui.QListWidgetItem(icon, text)
        self.ui.element_list.addItem(item)

if (__name__ == "__main__"):
    app = QtGui.QApplication(sys.argv)
    myApp = Main()
    myApp.show()
    sys.exit(app.exec_())
希望,这会帮助别人