PyQt5 QGraphicsView加载图片后,怎样框选矩形,并返回矩形在·图片上的坐标 该如何实现实现
时间: 2023-12-28 18:04:14 浏览: 36
可以通过继承QGraphicsView和QGraphicsScene来实现该需求。具体步骤如下:
1. 在QGraphicsView中重写mousePressEvent、mouseMoveEvent和mouseReleaseEvent事件。
2. 在mousePressEvent事件中记录鼠标按下的坐标,并创建一个QGraphicsRectItem对象,将其添加到QGraphicsScene中。
3. 在mouseMoveEvent事件中计算鼠标移动的距离,根据距离设置矩形的大小。
4. 在mouseReleaseEvent事件中计算矩形在图片上的坐标,并返回。
下面是一个简单的示例代码:
```python
from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsRectItem
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
class ImageView(QGraphicsView):
def __init__(self, parent=None):
super(ImageView, self).__init__(parent)
self.scene = QGraphicsScene(self)
self.setScene(self.scene)
self.setDragMode(QGraphicsView.ScrollHandDrag)
# 加载图片
self.image = QPixmap("image.jpg")
self.scene.addPixmap(self.image)
# 记录鼠标按下的坐标
self.start_point = None
# 创建矩形框
self.rect_item = QGraphicsRectItem()
self.rect_item.setPen(Qt.red)
self.rect_item.setZValue(1)
self.scene.addItem(self.rect_item)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.start_point = event.pos()
self.rect_item.setRect(self.start_point.x(), self.start_point.y(), 0, 0)
def mouseMoveEvent(self, event):
if self.start_point is not None:
width = event.pos().x() - self.start_point.x()
height = event.pos().y() - self.start_point.y()
self.rect_item.setRect(self.start_point.x(), self.start_point.y(), width, height)
def mouseReleaseEvent(self, event):
if self.start_point is not None:
x1 = self.rect_item.sceneBoundingRect().x()
y1 = self.rect_item.sceneBoundingRect().y()
x2 = x1 + self.rect_item.sceneBoundingRect().width()
y2 = y1 + self.rect_item.sceneBoundingRect().height()
print("Rect on image: ({}, {}, {}, {})".format(x1, y1, x2, y2))
```
在上述示例代码中,我们重写了mousePressEvent、mouseMoveEvent和mouseReleaseEvent事件,并在mousePressEvent事件中记录了鼠标按下的坐标,创建了一个QGraphicsRectItem对象并将其添加到QGraphicsScene中。在mouseMoveEvent事件中计算了鼠标移动的距离,并根据距离设置了矩形的大小。在mouseReleaseEvent事件中计算了矩形在图片上的坐标,并打印输出。
当然,该示例代码只是一个简单的实现,您可以根据具体需求进行修改和完善。