Inheritance QListWidgetItem在拖放事件期间丢失超类

Inheritance QListWidgetItem在拖放事件期间丢失超类,inheritance,python-3.5,pyqt5,Inheritance,Python 3.5,Pyqt5,我有一个自定义的ListWidgetItem类子项,它继承了通常的QListWidgetItem。当我在两个ListWidget之间拖放该项时,我会丢失不属于QListWidgetItem的所有内容。下面是一个示例。请注意,所有项目最初都列为子项目类型。我们可以访问常见的ListWidgetItem属性,如setBackground(),也可以访问子项中定义的新属性,如名称。将项目拖动到listWidget2后,它将保留其背景,但不再具有对name属性的访问权限。注释掉name属性后,print

我有一个自定义的ListWidgetItem类
子项
,它继承了通常的QListWidgetItem。当我在两个ListWidget之间拖放该项时,我会丢失不属于QListWidgetItem的所有内容。下面是一个示例。请注意,所有项目最初都列为
子项目
类型。我们可以访问常见的ListWidgetItem属性,如
setBackground()
,也可以访问
子项中定义的新属性,如
名称。将项目拖动到listWidget2后,它将保留其背景,但不再具有对name属性的访问权限。注释掉name属性后,
printTypes()
函数确认该项现在是QListWidgetItem,而不是子类项

import sys
from PyQt5 import QtWidgets
from PyQt5 import QtCore
from PyQt5 import QtGui

class SubItem(QtWidgets.QListWidgetItem):
    def __init__(self, name):
        super(SubItem, self).__init__(name)

        self.setBackground(QtGui.QColor('#A3B5C7'))

        self.name = name

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.widget = QtWidgets.QWidget()
        self.widget.setLayout(QtWidgets.QVBoxLayout())
        self.setCentralWidget(self.widget)

        self.listWidget1 = QtWidgets.QListWidget()
        self.listWidget1.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
        self.listWidget1.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
        self.listWidget1.setDefaultDropAction(QtCore.Qt.MoveAction)
        self.listWidget1.setAcceptDrops(True)
        self.widget.layout().addWidget(self.listWidget1)

        for n in ['a', 'b', 'c']:
            self.listWidget1.addItem(SubItem(n))

        self.listWidget2 = QtWidgets.QListWidget()
        self.listWidget2.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
        self.listWidget2.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop)
        self.listWidget2.setDefaultDropAction(QtCore.Qt.MoveAction)
        self.listWidget2.setAcceptDrops(True)
        self.widget.layout().addWidget(self.listWidget2)


        self.button = QtWidgets.QPushButton('Show Types')
        self.widget.layout().addWidget(self.button)

        self.button.clicked.connect(self.printTypes)
        self.show()


    def printTypes(self):
        count = self.listWidget1.count()
        for i in range(count):
            item = self.listWidget1.item(i)
            print('Widget1: ', item.name, item)

        count = self.listWidget2.count()
        for i in range(count):
            item = self.listWidget2.item(i)
            print('Widget2: ', item.name, item)

app = QtWidgets.QApplication(sys.argv)
m = MainWindow()
sys.exit(app.exec_())

我是否需要以某种方式重载
dropEvent()
?如何确保将整个类传递给新的ListWidget?

没有办法。您所能做的就是解释和(列表小部件的模型/项的工作方式相同)。谢谢,我将尝试在
setData
函数中传递必要的信息。我们应该以复制品的形式结束吗?可能的复制品没有办法。您所能做的就是解释和(列表小部件的模型/项的工作方式相同)。谢谢,我将尝试在
setData
函数中传递必要的信息。我们是否应该关闭为副本?可能的副本