【发布时间】:2019-06-11 11:03:59
【问题描述】:
我有以下两个类:
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 的自定义多边形类。该类的对象存储在“场景”类的列表中:
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()
【问题讨论】:
-
@eyllanesc PyQt5。我现在将尝试创建一个示例。
-
我成功了,谢谢 :)
标签: python python-3.x pyqt pyqt5 pickle