PyQt5 QGraphicsView加载图片后,怎样框选矩形,并返回矩形在·图片上的坐标
时间: 2023-12-16 18:03:34 浏览: 97
你可以通过重写`QGraphicsView`的`mousePressEvent`、`mouseMoveEvent`和`mouseReleaseEvent`方法来实现矩形框选功能,并计算出矩形在图片上的坐标。
以下是示例代码:
```python
from PyQt5.QtCore import Qt, QPointF, QRectF
from PyQt5.QtGui import QPixmap, QPainter, QBrush, QColor, QPen
from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene
class ImageView(QGraphicsView):
def __init__(self):
super().__init__()
self.scene = QGraphicsScene(self)
self.setScene(self.scene)
self.image_item = self.scene.addPixmap(QPixmap('image.png'))
self.rubber_band = None # 用于绘制矩形框选区域
self.start_pos = None # 框选起始位置
self.end_pos = None # 框选终止位置
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
# 记录起始位置
self.start_pos = event.pos()
# 创建矩形框选区域
if self.rubber_band is None:
self.rubber_band = self.scene.addRect(QRectF(), QPen(), QBrush(QColor(255, 255, 255, 100)))
def mouseMoveEvent(self, event):
if self.start_pos is not None:
# 记录终止位置
self.end_pos = event.pos()
# 计算矩形框选区域大小和位置
rect = QRectF(self.start_pos, self.end_pos).normalized()
self.rubber_band.setRect(rect)
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
if self.start_pos is not None and self.end_pos is not None:
# 计算矩形框选区域大小和位置
rect = QRectF(self.start_pos, self.end_pos).normalized()
# 计算矩形在图片上的坐标
rect = self.mapToScene(rect).boundingRect().intersected(self.image_item.boundingRect())
# 输出矩形在图片上的坐标
print('Rect:', rect.x(), rect.y(), rect.width(), rect.height())
# 清除框选状态
self.start_pos = None
self.end_pos = None
if self.rubber_band is not None:
self.scene.removeItem(self.rubber_band)
self.rubber_band = None
```
在上面的代码中,`QGraphicsView`显示了一张名为`image.png`的图片,并且实现了矩形框选功能。当你按下鼠标左键时,会记录下起始位置,并创建一个矩形框选区域。当你移动鼠标时,会根据起始位置和终止位置计算出矩形框选区域的大小和位置,并更新该区域。当你释放鼠标左键时,会计算出矩形在图片上的坐标,并输出到控制台上。
阅读全文