如何擦除 PyQt5 QPainter 中的点?

How to erase point in PyQt5 QPainter?

我想在图像上显示加速度计的 x 和 y 坐标。我使用 QPainter 来设置图像和 drawPoint 函数来绘制给定点的坐标。当绘制新坐标时,我需要擦除旧坐标,以便一次只有一个。在下面的代码中,我调用了 drawCoordinate 两次,结果是目标图像在 0,0 和 0.5,0.5 处有 2 个坐标点,但理想情况下我会留下最后绘制的坐标。

这是我在这里的第一个问题,希望我的格式是正确的!让我知道是否需要修复任何内容以帮助清晰度。


class Target(QWidget):

    def __init__(self):
        super().__init__()
        self.drawing = False
        self.image = QPixmap(r"Pictures\target_png_300.png")
        self.setGeometry(0, 0, 300, 300)
        self.resize(self.image.width(), self.image.height())
        self.show()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(self.rect(), self.image)
    
    def paintCoordinate(self, x, y):
        painter = QPainter(self.image)
        r = QRect(-1, -1, 2, 2)
        painter.setWindow(r)
        pen = QPen(Qt.black, 0.06, Qt.DotLine, Qt.RoundCap)
        painter.setPen(pen)
        painter.drawPoint(QPointF(x, y))

if __name__ == '__main__':
    
    app = QApplication(sys.argv)
    ex = Target()
    ex.paintCoordinate(0, 0)
    ex.paintCoordinate(0.5, 0.5)
    sys.exit(app.exec_())

如果你只想要一个点,那么不要修改QPixmap,直接在paintEvent方法中绘制即可:

class Target(QWidget):
    def __init__(self):
        super().__init__()
        self._pixmap = QPixmap()
        self._coordinate = QPointF()

    @property
    def pixmap(self):
        return self._pixmap

    @pixmap.setter
    def pixmap(self, pixmap):
        self._pixmap = pixmap.copy()
        self.update()
        size = self.pixmap.size()
        if size.isValid():
            self.resize(size)
        else:
            self.resize(300, 300)

    @property
    def coordinate(self):
        return self._coordinate

    @coordinate.setter
    def coordinate(self, point):
        self._coordinate = point
        self.update()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(self.rect(), self.pixmap)
        r = QRect(-1, -1, 2, 2)
        painter.setWindow(r)
        pen = QPen(Qt.black, 0.06, Qt.DotLine, Qt.RoundCap)
        painter.setPen(pen)
        painter.drawPoint(self.coordinate)


if __name__ == "__main__":

    app = QApplication(sys.argv)
    ex = Target()
    ex.pixmap = QPixmap(r"Pictures\target_png_300.png")
    ex.coordinate = QPointF(0, 0)
    ex.coordinate = QPointF(0.5, 0.5)
    ex.show()
    sys.exit(app.exec_())

在光栅图像上绘图意味着覆盖其内容,没有“擦除”或“撤消”:这就像在绘画上使用画笔:如果您尝试“擦除” ”这就像在您要“去除油漆”的东西上使用漂白剂。

跟踪您手动绘制的内容(坐标),然后相应地实施 paintEvent

class Target(QWidget):

    def __init__(self):
        super().__init__()
        self.drawing = False
        self.image = QPixmap(r"Pictures\target_png_300.png")
        self.setGeometry(0, 0, 300, 300)
        self.resize(self.image.width(), self.image.height())
        self.points = []
        self.show()

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.drawPixmap(self.rect(), self.image)
        r = QRect(-1, -1, 2, 2)
        <b>painter.setWindow(r)
        painter.setPen(QPen(Qt.black, 0.06, Qt.DotLine, Qt.RoundCap))
        for point in self.points:
            painter.drawPoint(point)</b>
    
    def paintCoordinate(self, x, y):
        <b>self.points.append(QPointF(x, y))
        self.update()</b>

    def deleteLastPoint(self):
        self.points.pop()
        self.update()


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    ex = Target()
    ex.paintCoordinate(0, 0)
    ex.paintCoordinate(0.5, 0.5)
    QTimer.singleShot(1000, lambda: ex.deleteLastPoint())
    sys.exit(app.exec_())