pyqt5 graphicsView 加载显示图片,在图片上鼠标点击图片拖动框选红色矩形并返回矩形在图片上的坐标
时间: 2023-10-07 07:09:09 浏览: 217
你可以使用`QGraphicsScene`和`QGraphicsView`来显示图片,并使用`QGraphicsRectItem`来绘制矩形。以下是一个示例代码:
```python
import sys
from PyQt5.QtCore import Qt, QRectF
from PyQt5.QtGui import QPixmap, QColor, QPainter
from PyQt5.QtWidgets import QGraphicsScene, QGraphicsView, QGraphicsRectItem, QApplication
class ImageViewer(QGraphicsView):
def __init__(self, pixmap):
super().__init__()
self.scene = QGraphicsScene(self)
self.setScene(self.scene)
self.setAlignment(Qt.AlignLeft | Qt.AlignTop)
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
self.setRenderHint(QPainter.Antialiasing)
self.setDragMode(QGraphicsView.ScrollHandDrag)
self.setFixedSize(pixmap.width(), pixmap.height())
self.rect_item = None
self.scene.addPixmap(pixmap)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
pos = event.pos()
scene_pos = self.mapToScene(pos)
self.rect_item = QGraphicsRectItem(QRectF(scene_pos, scene_pos))
self.rect_item.setPen(QColor(255, 0, 0))
self.scene.addItem(self.rect_item)
def mouseMoveEvent(self, event):
if self.rect_item is not None:
pos = event.pos()
scene_pos = self.mapToScene(pos)
rect = QRectF(self.rect_item.rect().topLeft(), scene_pos).normalized()
self.rect_item.setRect(rect)
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
if self.rect_item is not None:
rect = self.rect_item.rect()
image_rect = QRectF(0, 0, self.scene.width(), self.scene.height())
if rect.intersects(image_rect):
rect = rect.intersected(image_rect)
x, y, w, h = rect.getCoords()
print(f"Selected Rect: ({x}, {y}, {w}, {h})")
self.scene.removeItem(self.rect_item)
self.rect_item = None
if __name__ == '__main__':
app = QApplication(sys.argv)
pixmap = QPixmap('image.jpg')
viewer = ImageViewer(pixmap)
viewer.show()
sys.exit(app.exec_())
```
在这个示例中,我们使用`QGraphicsScene`来显示图片,并使用`QGraphicsView`来显示场景。在`mousePressEvent`中,我们创建了一个红色矩形`QGraphicsRectItem`,并在场景中添加它。在`mouseMoveEvent`中,我们更新矩形的大小。最后,在`mouseReleaseEvent`中,我们计算矩形在图片上的坐标,并将其打印出来。注意,我们在`mouseReleaseEvent`中还删除了矩形。
阅读全文