每個拖放操作(從一個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