2014-04-06 6 views
5

Было бы весьма интересно узнать, почему наличие экземпляра объекта Qt в качестве атрибута MyClass() вызывает журнал сбоев с двумя страницами. И как избежать этого:Python: Pickle and 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. Согласились с вашей оценкой, если ОП не действительно нужно рассортировать виджеты, а скорее просто другой материал, который содержит экземпляр класса. Если это так, мои комментарии поддерживают предложение. Но даже в этом случае это похоже на хакерское обходное решение для того, что, вероятно, является ошибочным дизайном. – 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

Спасибо Эхуморо! – alphanumeric