Python: Pickle和Qt(PyQT)

6

发现在MyClass()类的属性中使用Qt对象实例会导致两页的崩溃日志,这真是相当有趣。如何避免这种情况:

import sys, os, pickle
from PyQt4 import QtGui

class MyClass(object):
    def __init__(self):
        self.myQtWidget=QtGui.QPushButton() 
        pass 

app = QtGui.QApplication(sys.argv)
myInstance=MyClass()
pickle.dump( myInstance, open( "save.mydata", "wb" ) )

1
我很想知道为什么您需要pickle一个QWidget的实例。在我看来,这似乎是xy问题的一个案例(请参见http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。如果您需要解决方案,可能值得提出一个新问题,解释您尝试使用pickling解决什么问题(因为如您下面所见,pickling不起作用)。 - three_pineapples
1
@three_pineapples。我同意你的评估,除非OP实际上不需要将小部件进行pickle,而只是类实例包含的其他内容。如果是这样,我的下面的评论提供了一个解决方案。但即便如此,这似乎是对可能存在缺陷设计的一种hackish解决方法。 - ekhumoro
1个回答

7

来自文档:

The following PyQt4 classes may be pickled.

QByteArray
QChar
QColor
QDate
QDateTime
QKeySequence
QLatin1Char
QLatin1String
QLine
QLineF
QMatrix
QPoint
QPointF
QPolygon
QRect
QRectF
QSize
QSizeF
QString
QTime

Also all named enums (QtCore.Qt.Key for example) may be pickled.


所以我们不能对定义了小部件属性的任何类实例进行Pickling?没有任何办法吗? - alphanumeric
4
你可以通过为你的类定义__getstate____setstate__方法来控制如何进行序列化。这两个方法的Python文档清楚地解释了你需要做什么(基本上,在__getstate__方法中返回实例的__dict__副本,但不包括无法序列化的部分,并在__setstate__中恢复丢失的部分)。 - ekhumoro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接