【问题标题】:Python: Pickle and Qt (PyQT)Python:Pickle 和 Qt (PyQT)
【发布时间】:2014-04-06 04:08:10
【问题描述】:

找到一个 Qt 对象的实例作为 MyClass() 的属性会导致两页崩溃日志的原因会很有趣。以及如何避免:

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" ) )

【问题讨论】:

  • 我很想知道您为什么需要腌制一个 QWidget 的实例。在我看来,这就像 xy 问题的一个案例(参见 meta.stackexchange.com/questions/66377/what-is-the-xy-problem )。如果您需要解决方案,可能值得提出一个新问题,解释您试图用酸洗解决方案解决什么(因为如下所示,酸洗不起作用)
  • @three_pineapples。同意您的评估,除非 OP 真的不需要腌制小部件,而只是需要腌制类实例包含的其他东西。如果是这样,我在下面的评论提供了一个解决方案。但即便如此,对于可能存在缺陷的设计,这似乎是一种骇人听闻的解决方法。

标签: python qt pyqt pickle


【解决方案1】:

来自docs

以下 PyQt4 类可能会被腌制。

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

所有命名的枚举(例如 QtCore.Qt.Key)都可以被腌制。

【讨论】:

  • 所以我们不能腌制任何将小部件定义为属性的类实例?没办法?
  • @Sputnix。您可以通过为您的班级定义__getstate____setstate__ 来控制酸洗的完成方式。 python docs for these methods 非常清楚地解释了您需要做什么(基本上,返回实例的 __dict__ 的副本,而 __getstate__ 中没有不可腌制的位,并恢复 __setstate__ 中的缺失位)。
猜你喜欢
  • 1970-01-01
  • 2013-04-09
  • 2011-12-04
  • 2011-12-12
  • 2014-10-12
  • 1970-01-01
  • 2015-09-21
  • 2017-11-06
  • 2014-12-29
相关资源
最近更新 更多