为了账号安全,请及时绑定邮箱和手机立即绑定

PyQt5 : 已删除已包装的 c/c++ 对象

PyQt5 : 已删除已包装的 c/c++ 对象

拉丁的传说 2022-08-02 18:35:58
我正在尝试创建自己的图形项目,其中心有一个圆圈及其标签。class circle(QGraphicsItem):    def __init__(self, radius=None, name=None, x=None, y=None, parent=None):        super(circle, self).__init__(parent)        self.radius = radius if radius else random.random()*500        self.label = name if name else "cirA"        self.x = x if x else random.randint(0, 900)        self.y = y if y else random.randint(0, 600)        # self.center = complex(self.x, self.y)    def boundingRect(self):        penWidth = 1.0        return QRectF(-self.x - penWidth / 2, -self.y - penWidth / 2,                      self.x + penWidth, self.y + penWidth)    def paint(self, painter, option, widget):        painter.drawEllipse(0, 0, self.radius, self.radius)        painter.drawText(self.label)现在在我的主GUI中,一个圆圈列表被保存为circleList,我正在尝试将圆圈项目添加为for cir in self.circleList:            self.painter.addItem(cir)但这会返回RuntimeError: wrapped C/C++ object of type circle has been deleted帮助?这应该可以完成最小可复制示例的技巧注意:FBS是必需的,项目应使用fbs startproject该圆圈也将与以下内容一起添加from fbs_runtime.application_context.PyQt5 import ApplicationContextfrom PyQt5.QtWidgets import *from PyQt5.QtGui import *from PyQt5.QtCore import *class gui(QDialog):    def __init__(self, parent=None):        super(gui, self).__init__(parent)        self.painter = QGraphicsScene(10, 10, 900, 600)        self.canvas = QGraphicsView(self.painter)        mainLayout = QGridLayout()        mainLayout.addWidget(self.canvas, 0, 0, 6, 2)        self.setLayout(mainLayout)        self.circleList = []    def drawCircle(self):        pen = QPen(Qt.black, 2, Qt.SolidLine)        self.painter.clear()        for cir in self.circleList:            self.painter.addItem(cir)        self.painter.update()        self.canvas.update()        self.update()    def newCircle(self, cir):        self.circleList.append(cir)        self.drawCircle()    def addCircle(self):        return self.newCircle(circle())
查看完整描述

1 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

图形视图框架不需要您删除和添加项目。在你的例子中,当使用 clear() 时,你正在从场景中删除项目,并且你正在从内存中删除它们,所以 circleList 将具有不再分配内存的变量。


另一方面,如果你想要一个自定义的QGraphicsItem,在中心绘制一个圆圈和一个文本,那么 boundingRect必须具有矩形的大小。


考虑到上述情况,解决方案如下:


class Circle(QGraphicsItem):

    def __init__(self, radius=None, name="", x=0, y=0, parent=None):

        super(Circle, self).__init__(parent)

        self.radius = radius or random.random() * 500

        self.label = name if name else "cirA"

        self.setPos(x or random.randint(0, 900), y or random.randint(0, 900))


    def boundingRect(self):

        return QRectF(0, 0, self.radius, self.radius)


    def paint(self, painter, option, widget):

        painter.drawEllipse(0, 0, self.radius, self.radius)

        painter.drawText(0, 0, self.radius, self.radius, Qt.AlignCenter, self.label)

class Gui(QDialog):

    def __init__(self, parent=None):

        super(Gui, self).__init__(parent)

        self.painter = QGraphicsScene(10, 10, 900, 600)

        self.canvas = QGraphicsView(self.painter)

        mainLayout = QGridLayout(self)

        mainLayout.addWidget(self.canvas)


    @property

    def circleList(self):

        return [item for item in self.painter.items() if isinstance(item, Circle)]


    def newCircle(self, cir):

        self.painter.addItem(cir)

        return cir


    def addCircle(self):

        return self.newCircle(Circle())


查看完整回答
反对 回复 2022-08-02
  • 1 回答
  • 0 关注
  • 238 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信