解开QObject时如何防止RuntimeError?

时间:2018-01-18 16:17:01

标签: python pyqt pickle

尝试取消腌制的QObject(使用Python 2.7,PyQt4或5,pickle或cPickle),引发以下RuntimeError

RuntimeError: super-class __init__() of type QObject was never called

一个最小的例子:

cPickle.loads(cPickle.dumps(QtCore.QObject(), cPickle.HIGHEST_PROTOCOL))

我知道按设计拆除对象不会调用对象的__init__()方法。

那么,在这种情况下,如何确保调用超类__init__()

一个看似相似的问题被问到here,但没有回答。

1 个答案:

答案 0 :(得分:1)

基于this answer的一种可能的解决方案可以实现如下(一个稍微复杂的示例,带有自定义属性):

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)

如有必要,可以使用setParent()设置父级。