如何擦除 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_())
我想在图像上显示加速度计的 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_())