У меня есть два следующих класса:
class QPolygonModel(QtGui.QPolygon):
_idx = None
_selected = None
def __init__(self, idx, polygon: QtGui.QPolygon = None):
# Call default constructor
if polygon is None:
super().__init__()
# Call copy constructor
else:
super().__init__(polygon)
self._idx = idx
self._selected = False
@property
def idx(self):
return self._idx
@property
def is_selected(self):
return self._selected
@is_selected.setter
def is_selected(self, flag):
self._selected = flag
def get_points(self):
res = []
for i in range(0, self.size()):
res.append(self.point(i))
return res
Это пользовательский класс многоугольника, который наследуется от QPolygon.Объекты этого класса хранятся в списке в классе «Scene»:
class ImageAnnotatorState:
points = None
radius = None
image = None
polygons = None
_finished = None
multiselect = None
def __init__(self, image):
super().__init__()
self.points = QtGui.QPolygon()
self.radius = 8
self.image = image
self.polygons = self._init_polygons()
self.is_finished = False
self.multiselect = False
def _init_polygons(self):
result = []
for annotation in self.image.annotations:
polyline = QPolygonModel(annotation.get_id())
for point in annotation.points:
q_point = QPoint(point.x, point.y)
polyline.append(q_point)
result.append(polyline)
return result
@property
def is_finished(self):
return self._finished
@is_finished.setter
def is_finished(self, flag):
self._finished = flag
Теперь для создания функции отмены мне нужно создать глубокую копию этого класса сцены, чтобы я мог сохранитьсостояние, которое было активным до изменения сцены.
Итак, в форме QDialog я пытаюсь сделать следующее:
class ImageAnnotator(QDialog):
_state = None
_previous_state = None
def __init__(self, image):
super().__init__()
self._state = ImageAnnotatorState(image)
self._previous_state = copy.deepcopy(self._state)
self.show()
Здесь вызов Deepcopy завершается неудачей со следующим исключением:
SystemError: attempt to pickle unknown type 'QPolygonModel'
Что я делаю не так?
РЕДАКТИРОВАТЬ:
Воспроизводимый пример:
from PyQt5 import QtCore, QtGui
from PyQt5.QtWidgets import QDialog
from PyQt5.QtWidgets import QApplication
import copy
import sys
class Test(QtGui.QPolygon):
idx = None
def __init__(self, z = None):
if z is None:
super().__init__()
else:
super().__init__(z)
class State:
test = None
def __init__(self):
self.test = [Test(), Test()]
print(self.test)
class Main(QDialog):
state = None
prev = None
def __init__(self):
super().__init__()
self.state = State()
prev = copy.deepcopy(self.state)
print(prev)
app = QApplication(sys.argv)
Main()