如何从QGraphicsScene中删除QRect

问题描述 投票:2回答:1

我有一个带有一堆QRect的QGraphicsScene。我将QRects用作QPixmap的叠加层以显示检测到的对象。我需要清除场景中的所有矩形,但不知道如何。

从QGraphicsScene清除所有QRect而不重新绘制图像的最佳方法是什么?

现在,当我将QRect添加到场景中时,我会保留一个QRect列表,然后清除,我尝试遍历所有rect并使用QGraphicsScene.removeItem(rect)删除矩形,但这不起作用。我收到以下错误:

TypeError: removeItem(self, QGraphicsItem): argument 1 has unexpected type 'QRectF'

我想QRect不是图形项目。但是我应该如何将其从场景中删除。下面是我添加或(尝试)删除Rect的代码:

if self.is_viewing_tracks:
    for track_id, positions in self.tracks.items():
        for frameno, pos in positions.items():
            if int(frameno) == self.frameno:
                x, y = pos
                rect = QRectF(x-5, y-5, 10, 10)
                self.scene.addRect(rect)
                text = self.scene.addText(str(track_id))
                text.setPos(x, y)
                self.rects.append(rect)
            else:
                for rect in self.rects:
                    self.scene.removeItem(rect)

从QGraphicsScene中删除QRect的right方法是什么?

python pyqt pyqt5 qgraphicsscene
1个回答
1
投票

QRectFs不会添加到QGraphicsScene中,而是用于通过addRect()方法创建QGraphicsRectItem的,因此您必须删除QGraphicsRectItem而不是QRectF。解决方案是将QGraphicsRectItems存储在self.rects中:

if self.is_viewing_tracks:
    for track_id, positions in self.tracks.items():
        for frameno, pos in positions.items():
            if int(frameno) == self.frameno:
                x, y = pos
                rect = QRectF(x - 5, y - 5, 10, 10)
                rect_item = self.scene.addRect(rect)
                text = self.scene.addText(str(track_id))
                text.setPos(x, y)
                self.rects.append(rect_item)
            else:
                for rect in self.rects:
                    self.scene.removeItem(rect)
                self.rects = []
© www.soinside.com 2019 - 2024. All rights reserved.