Python 如何在PyQt5 QPainter中擦除点?
我想在图像上显示加速度计的x和y坐标。我使用QPaint设置图像和drawPoint函数来绘制给定点的坐标。绘制新坐标时,我需要删除旧坐标,以便一次只有一个坐标。在下面的代码中,我调用了drawCoordinate两次,结果是目标图像在0,0和0.5,0.5处有两个坐标点,但理想情况下,我只剩下最后绘制的坐标 这是我在这里的第一个问题,所以我希望我的格式是正确的!如果我需要解决任何问题以帮助澄清,请告诉我Python 如何在PyQt5 QPainter中擦除点?,python,qt,pyqt,pyqt5,coordinates,Python,Qt,Pyqt,Pyqt5,Coordinates,我想在图像上显示加速度计的x和y坐标。我使用QPaint设置图像和drawPoint函数来绘制给定点的坐标。绘制新坐标时,我需要删除旧坐标,以便一次只有一个坐标。在下面的代码中,我调用了drawCoordinate两次,结果是目标图像在0,0和0.5,0.5处有两个坐标点,但理想情况下,我只剩下最后绘制的坐标 这是我在这里的第一个问题,所以我希望我的格式是正确的!如果我需要解决任何问题以帮助澄清,请告诉我 class Target(QWidget): def __init__(sel
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方法中进行绘制:
类目标(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self._pixmap=QPixmap()
自身坐标=QPointF()
@财产
def pixmap(自):
返回自我。\u pixmap
@pixmap.setter
def pixmap(自身,pixmap):
self.\u pixmap=pixmap.copy()
self.update()
size=self.pixmap.size()
如果size.isValid():
自我调整大小(大小)
其他:
自我调整大小(300300)
@财产
def坐标(自身):
返回自坐标
@坐标设定器
def坐标(自身、点):
自身坐标=点
self.update()
def paintEvent(自身,事件):
油漆工=油漆工(自身)
painter.drawPixmap(self.rect(),self.pixmap)
r=QRect(-1,-1,2,2)
设置窗口(r)
pen=QPen(Qt.black,0.06,Qt.DotLine,Qt.RoundCap)
画师:画笔
绘制点(自坐标)
如果名称=“\uuuuu main\uuuuuuuu”:
app=QApplication(sys.argv)
ex=目标()
ex.pixmap=QPixmap(r“Pictures\target\u png\u 300.png”)
坐标=QPointF(0,0)
ex.坐标=QPointF(0.5,0.5)
例如: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)
painter.setWindow(r)
painter.setPen(QPen(Qt.black, 0.06, Qt.DotLine, Qt.RoundCap))
for point in self.points:
painter.drawPoint(point)
def paintCoordinate(self, x, y):
self.points.append(QPointF(x, y))
self.update()
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_())
类目标(QWidget):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.drawing=False
self.image=QPixmap(r“Pictures\target\u png\u 300.png”)
self.setGeometry(0,0,300,300)
self.resize(self.image.width(),self.image.height())
self.points=[]
self.show()
def paintEvent(自身,事件):
油漆工=油漆工(自身)
painter.drawPixmap(self.rect(),self.image)
r=QRect(-1,-1,2,2)
设置窗口(r)
画师设置笔(QPen(Qt.black,0.06,Qt.DotLine,Qt.RoundCap))
对于自我点中的点:
绘制点(点)
def油漆坐标(自、x、y):
self.points.append(QPointF(x,y))
self.update()
def deleteLastPoint(自):
self.points.pop()
self.update()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
导入系统
app=QApplication(sys.argv)
ex=目标()
例如,油漆坐标(0,0)
例如油漆坐标(0.5,0.5)
QTimer.singleShot(1000,lambda:ex.deleteLastPoint())
sys.exit(app.exec_())
非常感谢您的支持!这个解释很有道理,我没有意识到我正在覆盖图像。还感谢您编辑我的问题:)