每个拖放操作(从一个QListWidget到另一个QListWidget)上的强度和复杂度声明错误都让我感到疯狂。我知道AssertionError
是由一个类实例的属性引起的(类实例变量通过.setData()附加到QListWidget Item。其中一个属性与pickle
不兼容,如果您能够解决此问题,我将不胜感激。以及如何高效地进行调试,到目前为止唯一的解决方案是逐个检查每个类的属性,将其设置为None,然后检查是否解决了问题,但这种方法非常繁琐且耗时。Qt和Pickle的声明错误疯狂
日后进行编辑:
调试后几个小时我已经缩小代码到它的最低限度它地复制我也遇到了同样的问题时,Qt控件(如QListWidget)无力。使用pickle
来执行他们的任务。
一个简短的信息:ClassA和ClassB的的
两个实例声明。然后instB被存储在instA属性中。反之亦然:instA存储到instB属性。其余的很简单:通过.setData()的instA被分配给ListWidget项目。 Drag'nDrop项目导致酱菜失败。 请告知如何在将来避免这种情况。是什么导致它。如果有可能的情况下解决它。
from PyQt4 import QtCore, QtGui
class Base(dict):
def __init__(self):
super(Base, self).__init__()
def setInstB(self, instB):
self['instB']=instB
class ClassA(Base):
def __init__(self):
super(ClassA, self).__init__()
class ClassB(Base):
def __init__(self):
super(ClassB, self).__init__()
def setInstA(self, instA):
self.instA=instA
instA=ClassA()
instB=ClassB()
instA.setInstB(instB)
instB.setInstA(instA)
class Dialog(QtGui.QMainWindow):
def __init__(self, instA):
super(QtGui.QMainWindow,self).__init__()
widget = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
widget.setLayout(layout)
self.listA=QtGui.QListWidget()
self.listA.setAcceptDrops(True)
self.listA.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
self.listA.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
listItem=QtGui.QListWidgetItem(str(id(instA)))
listItem.setData(QtCore.Qt.UserRole, instA)
self.listA.addItem(listItem)
self.listB=QtGui.QListWidget()
self.listB.setAcceptDrops(True)
self.listB.setDragDropMode(QtGui.QAbstractItemView.DragDrop)
self.listB.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
layout.addWidget(self.listA)
layout.addWidget(self.listB)
self.setCentralWidget(widget)
app = QtGui.QApplication(sys.argv)
dialog=Dialog(instA)
dialog.show()
dialog.resize(480,320)
sys.exit(app.exec_())
新手在这里...但你有任何字典里面的元组? – Roberto
您是否检查过您的问题是否与此相同? http://stackoverflow.com/questions/4426981/python-pickle-dumps-assertionerror – Roberto
我读过你提到的那个。有人说那里有一些旧的pickle协议无法处理的数据。要解决你的问题,请使用pickle.HIGHEST_PROTOCOL'。我不清楚如何在PyQt中设置'use pickle.HIGHEST_PROTOCOL'覆盖。有人知道吗? – alphanumeric