Python 如何防止取消勾选QObject时出现运行时错误?
尝试解除picklePython 如何防止取消勾选QObject时出现运行时错误?,python,pyqt,pickle,Python,Pyqt,Pickle,尝试解除pickleQObject(使用Python 2.7、PyQt4或5、pickle或cPickle)的pickle将引发以下运行时错误: 运行时错误:从未调用类型为QObject的超级类\uuuuu init\uuuuuu() 一个简单的例子: cPickle.load(cPickle.dumps(QtCore.QObject(),cPickle.HIGHEST_协议)) 我知道,根据设计,取消勾选对象不会调用对象的\uuu init\uuu()方法 那么,在这种情况下,如何确保调用超类
QObject
(使用Python 2.7、PyQt4或5、pickle或cPickle)的pickle将引发以下运行时错误
:
运行时错误:从未调用类型为QObject的超级类\uuuuu init\uuuuuu()
一个简单的例子:
cPickle.load(cPickle.dumps(QtCore.QObject(),cPickle.HIGHEST_协议))
我知道,根据设计,取消勾选对象不会调用对象的\uuu init\uuu()
方法
那么,在这种情况下,如何确保调用超类\uuuu init\uuuu()
提出了一个看似相似的问题,但没有得到回答。基于的一个可能的解决方案可以实现如下(一个稍微复杂的示例,带有自定义属性):
然后,如有必要,可以使用setParent()
设置父项
import cPickle
from PyQt5 import QtCore
class MyQObject(QtCore.QObject):
def __init__(self, parent=None):
super(MyQObject, self).__init__(parent)
# Add some custom attribute
self.some_attribute = 'something'
def __setstate__(self, state):
# Restore attributes
self.__dict__.update(state)
# Call the superclass __init__()
super(MyQObject, self).__init__()
original = MyQObject()
pickle_string = cPickle.dumps(original, cPickle.HIGHEST_PROTOCOL)
restored = cPickle.loads(pickle_string)