2014-04-06 14 views
5

Es wäre ziemlich unterhaltsam zu finden, warum eine Instanz des Qt-Objekts als ein MyClass() Attribut ein zwei Seiten Crash-Protokoll verursacht. Und wie es zu vermeiden:Python: Pickle und 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

Ich wäre daran interessiert zu wissen, warum Sie eine Instanz eines QWidget pickle müssen. Es scheint mir ein Fall des xy-Problems zu sein (siehe http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Wenn Sie eine Lösung benötigen, könnte es sich lohnen, eine neue Frage zu stellen und zu erklären, was Sie mit der Beizlösung lösen wollten (denn wie Sie unten sehen können, wird das Beizen nicht funktionieren) –

+1

@three_pineapples. Entspricht Ihrer Einschätzung, es sei denn, das OP muss nicht wirklich die Widgets picken, sondern nur die anderen Dinge, die die Klasseninstanz enthält. Wenn ja, bietet mein Kommentar eine Lösung. Aber trotzdem scheint dies ein hackischer Workaround für ein wahrscheinlich fehlerhaftes Design zu sein. – ekhumoro

Antwort

6

Vom docs:

Folgende PyQt4 Klassen gebeizt werden.

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

Auch alle benannten Enums (QtCore.Qt.Key zum Beispiel) können gebeizt werden.

+0

Also können wir keine Klasseninstanzen mit Widgets, die als Attribute definiert sind, picken? Umsonst? – alphanumeric

+2

@ Sputnix. Sie können steuern, wie das Beizen gemacht wird, indem Sie '__getstate__' und' _setstate__' für Ihre Klasse definieren. Die [Python-Dokumente für diese Methoden] (https://docs.python.org/2/library/pickle.html#object.__getstate__) erklären ziemlich klar, was Sie tun müssen (im Grunde geben Sie eine Kopie des '__dict__ der Instanz zurück). 'ohne die nicht paketierbaren Bits in' __getstate__' und stelle die fehlenden Bits in '_setstate__' wieder her. – ekhumoro

+0

Danke Ekhumoro! – alphanumeric