2014-04-06 36 views
5

找到爲什麼將Qt對象的實例作爲MyClass()的屬性導致兩頁崩潰日誌會很有趣。而如何避免它:Python:Pickle和Qt(PyQT)

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

我很想知道爲什麼你需要醃一個QWidget的實例。在我看來,這似乎是一個xy問題的例子(參見http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。如果您需要解決方案,可能需要提出一個新問題來解釋您嘗試使用酸洗解決方案解決的問題(因爲您可以在下面看到,酸洗不起作用) –

+1

@three_pineapples。同意你的評估,除非OP不真的需要醃製小部件,而只是類實例包含的其他東西。如果是這樣,我的評論下面提供了一個解決方案。但即便如此,對於可能存在缺陷的設計來說,這似乎是一個駭人的解決方法。 – ekhumoro

回答

6

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

+0

因此,我們不能使用定義爲attrs的小部件來挑選任何類實例?沒有辦法? – alphanumeric

+2

@Sputnix。您可以通過爲您的課程定義'__getstate__'和'__setstate__'來控制酸洗的完成方式。 [這些方法的Python文檔](https://docs.python.org/2/library/pickle.html#object.__getstate__)很清楚地解釋你需要做什麼(基本上,返回實例的'__dict__ '__getstate__'中沒有不可打開的位,並在__setstate__中恢復缺失的位。 – ekhumoro

+0

謝謝Ekhumoro! – alphanumeric