PyQt5 QGraphicsView加载图片后,怎样增加在该控件上框选矩形,并返回矩形在·图片上的坐标
时间: 2023-12-17 10:05:23 浏览: 124
可以通过继承QGraphicsView类并在其中实现鼠标事件处理函数来实现在图片上框选矩形。具体操作如下:
1. 在类中定义一个QGraphicsRectItem对象用于绘制矩形。
2. 重写鼠标事件处理函数,当鼠标按下时,记录下起始点坐标;当鼠标移动时,根据起始点和当前点绘制矩形;当鼠标释放时,计算出矩形的坐标,并返回给调用者。
下面是一个示例代码:
``` python
from PyQt5.QtCore import Qt, QRectF
from PyQt5.QtGui import QPixmap, QPainter, QPen
from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsRectItem
class ImageView(QGraphicsView):
def __init__(self, parent=None):
super().__init__(parent)
self.scene = QGraphicsScene()
self.setScene(self.scene)
self.item = QGraphicsRectItem()
self.scene.addItem(self.item)
self.startPos = None
self.endPos = None
def loadImage(self, path):
pixmap = QPixmap(path)
self.scene.clear()
self.scene.addPixmap(pixmap)
self.setSceneRect(QRectF(pixmap.rect()))
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.startPos = event.pos()
self.item.setRect(QRectF(self.startPos, QSizeF()))
self.item.setPen(QPen(Qt.red, 2))
def mouseMoveEvent(self, event):
if self.startPos is not None:
self.endPos = event.pos()
rect = QRectF(self.startPos, self.endPos).normalized()
self.item.setRect(rect)
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
self.endPos = event.pos()
rect = QRectF(self.startPos, self.endPos).normalized()
self.item.setRect(rect)
self.startPos = None
self.endPos = None
# 计算矩形在图片上的坐标
rect = self.mapToScene(rect).boundingRect()
print(rect)
```
在这个示例中,我们继承了QGraphicsView类,并在其中实现了loadImage函数用于加载图片,以及重写了鼠标事件处理函数用于绘制矩形并计算矩形在图片上的坐标。使用时只需要实例化该类并调用loadImage函数加载需要显示的图片即可,如下所示:
``` python
app = QApplication(sys.argv)
view = ImageView()
view.loadImage('image.jpg')
view.show()
sys.exit(app.exec_())
```
阅读全文