PyQt5+PyQtGraph:如何在绘图区鼠标点击位置绘制红色填充矩形
PyQt5+PyQtGraph 点击绘制固定尺寸红色矩形的实现方案
核心实现思路
依靠PyQtGraph自带的图形项管理机制即可实现累积绘制效果:不需要主动清空画布内容,每次鼠标点击时在对应坐标生成符合尺寸要求的矩形项并添加到画布即可。针对2×2固定屏幕像素的尺寸要求,需要做尺寸坐标转换,避免视图缩放时矩形的实际显示大小发生变化。
代码补全步骤
1. 补充依赖导入
在文件头部引入绘制所需的相关类:
from PyQt5.QtCore import Qt from PyQt5.QtGui import QBrush, QColor, QPen from PyQt5.QtWidgets import QGraphicsRectItem import pyqtgraph as pg
2. 槽函数内补全绘制逻辑
在预留的#???标注位置(即已经通过mapSceneToView拿到点击点对应的视图坐标x、y之后),插入以下代码:
# 将2个屏幕像素的尺寸换算为当前视图坐标系下的等效值,保证矩形显示大小固定 pixel_convert = self.plotWidget.plotItem.vb.mapViewToDevice(pg.Point(1, 1)) rect_width = pixel_convert.x() * 2 rect_height = pixel_convert.y() * 2 # 以鼠标点击点为矩形中心,生成对应位置的矩形 red_rect = QGraphicsRectItem( x - rect_width / 2, y - rect_height / 2, rect_width, rect_height ) # 设置纯红色填充、无外边框 red_rect.setBrush(QBrush(QColor(255, 0, 0))) red_rect.setPen(QPen(Qt.NoPen)) # 将矩形添加到绘图部件,PyQtGraph会自动保留所有已添加元素,实现多点叠加 self.plotWidget.addItem(red_rect)
实用优化提示
- 不需要额外维护已绘制矩形的列表,只要不主动调用
plotWidget.clear()方法,所有添加的图形项都会持续显示,自然支持多次点击累积的需求。 - 直接写死视图坐标下的矩形宽高是常见误区:这种实现下缩放视图时,矩形的屏幕显示大小会随视图比例变化,无法满足2×2固定像素的要求,必须通过
mapViewToDevice做尺寸换算。 - 可以在绘制逻辑前增加有效区域判断,避免在坐标轴、画布外区域点击时误生成矩形:
# 判断点击是否落在有效绘图区内 if self.plotWidget.plotItem.vb.sceneBoundingRect().contains(view_pos): # 执行上述矩形绘制逻辑
内容的提问来源于stack exchange,提问作者ear1
相关产品推荐
相关产品推荐

