pyqt5 graphicsView 加载显示图片,在图片上鼠标框选红色矩形并返回矩形在图片上的坐标
时间: 2023-12-22 22:05:44 浏览: 264
PyQt5图片鼠标点击标点 QLabel实现在图片上标注点并获得坐标
5星 · 资源好评率100%
您可以通过继承 `QGraphicsView` 类来实现加载和显示图片,并通过重写 `mousePressEvent`、`mouseReleaseEvent` 和 `mouseMoveEvent` 方法来实现矩形的鼠标框选和坐标返回。
下面是一个简单的示例代码,您可以参考它来进行开发:
```python
from PyQt5.QtCore import Qt, QRectF
from PyQt5.QtGui import QPixmap, QBrush, QColor, QPainter
from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsRectItem, QApplication
class ImageView(QGraphicsView):
def __init__(self):
super().__init__()
self.scene = QGraphicsScene(self)
self.setScene(self.scene)
self.setRenderHint(QPainter.Antialiasing)
self.setDragMode(QGraphicsView.ScrollHandDrag)
self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.image_item = None
self.rect_item = None
self.origin = None
def load_image(self, filename):
self.scene.clear()
self.image_item = self.scene.addPixmap(QPixmap(filename))
self.scene.setSceneRect(self.image_item.boundingRect())
self.fitInView(self.scene.sceneRect(), Qt.KeepAspectRatio)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.origin = event.pos()
if not self.rect_item:
self.rect_item = QGraphicsRectItem()
self.rect_item.setPen(QPen(QColor(255, 0, 0), 2))
self.rect_item.setBrush(QBrush(QColor(255, 0, 0, 50)))
self.scene.addItem(self.rect_item)
self.rect_item.setZValue(1)
def mouseMoveEvent(self, event):
if self.origin:
current_pos = event.pos()
rect = QRectF(self.origin, current_pos).normalized()
self.rect_item.setRect(rect)
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton and self.rect_item:
rect = self.rect_item.rect()
x = rect.x() + rect.width() / 2
y = rect.y() + rect.height() / 2
pos = self.image_item.mapFromScene(QPointF(x, y))
print(pos.x(), pos.y())
self.origin = None
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
view = ImageView()
view.load_image('image.jpg')
view.show()
sys.exit(app.exec_())
```
在这个示例中,我们继承了 `QGraphicsView` 类,并实现了 `load_image` 方法来加载并显示图片。在 `mousePressEvent` 方法中,我们记录了鼠标点击位置,并创建了一个红色矩形项并添加到场景中。在 `mouseMoveEvent` 方法中,我们根据鼠标移动的位置更新矩形项的大小和位置。在 `mouseReleaseEvent` 方法中,我们计算出矩形项在图片上的位置,并将其打印到控制台中。
注意,在 `mousePressEvent` 和 `mouseReleaseEvent` 方法中,我们只处理鼠标左键的事件。这是因为右键用于拖动视图,我们不希望它与矩形框选功能发生冲突。
阅读全文