QGraphicsItem 转换为QGraphicsView 坐标的最简单方法
时间: 2024-01-24 16:49:10 浏览: 93
将QGraphicsItem的坐标转换为QGraphicsView坐标的最简单方法是使用QGraphicsView的mapFromScene函数。以下是一个示例:
```python
# item是要转换坐标的QGraphicsItem对象,view是QGraphicsView对象
item_pos = item.scenePos() # 获取item在场景中的坐标
view_pos = view.mapFromScene(item_pos) # 将item在场景中的坐标转换为view中的坐标
```
此外,还可以使用QGraphicsView的mapToScene函数将view坐标转换为场景坐标。例如:
```python
# view_pos是要转换坐标的QGraphicsView坐标
scene_pos = view.mapToScene(view_pos) # 将view坐标转换为场景坐标
```
请注意,这些函数需要考虑场景和视图之间的缩放和平移,因此您可以确保转换后的坐标是正确的。
相关问题
PyQt5 QGraphicsView加载图片后,怎样框选矩形,并返回矩形在·图片上的坐标
可以通过重写QGraphicsView的mousePressEvent、mouseMoveEvent和mouseReleaseEvent来实现框选矩形的功能,并计算矩形在图片上的坐标。
具体步骤如下:
1. 创建一个继承自QGraphicsView的自定义类,并在构造函数中设置一些必要的属性,如缩放、拖拽等。
2. 重写mousePressEvent,记录下鼠标按下时的坐标点。
3. 重写mouseMoveEvent,根据鼠标移动的坐标点,动态地绘制一个矩形框选区域。
4. 重写mouseReleaseEvent,记录下鼠标松开时的坐标点,并将框选区域的四个顶点的坐标转换为图片坐标系中的坐标。
下面是一个简单的示例代码:
```python
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
class ImageView(QGraphicsView):
def __init__(self, parent=None):
super().__init__(parent)
self.setDragMode(QGraphicsView.ScrollHandDrag)
self.setRenderHint(QPainter.Antialiasing)
self.setRenderHint(QPainter.SmoothPixmapTransform)
self.setTransformationAnchor(QGraphicsView.AnchorUnderMouse)
self.setResizeAnchor(QGraphicsView.AnchorUnderMouse)
self.scene = QGraphicsScene(self)
self.setScene(self.scene)
self.pixmap_item = QGraphicsPixmapItem()
self.scene.addItem(self.pixmap_item)
self.rect_item = QGraphicsRectItem()
self.rect_item.setPen(QPen(Qt.red, 2, Qt.SolidLine))
self.rect_item.setBrush(QBrush(Qt.transparent))
self.scene.addItem(self.rect_item)
self.start_point = None
self.end_point = None
def set_image(self, image_path):
pixmap = QPixmap(image_path)
self.pixmap_item.setPixmap(pixmap)
self.setSceneRect(QRectF(pixmap.rect()))
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.start_point = event.pos()
self.rect_item.setRect(QRectF(self.start_point, QSizeF()))
self.rect_item.setVisible(True)
super().mousePressEvent(event)
def mouseMoveEvent(self, event):
if self.start_point is not None:
self.end_point = event.pos()
rect = QRectF(self.start_point, self.end_point).normalized()
self.rect_item.setRect(rect)
super().mouseMoveEvent(event)
def mouseReleaseEvent(self, event):
if self.start_point is not None and self.end_point is not None:
rect = QRectF(self.start_point, self.end_point).normalized()
rect_mapped = self.mapToScene(rect).boundingRect()
print(f"Selected rect: {rect_mapped}")
self.start_point = None
self.end_point = None
self.rect_item.setVisible(False)
super().mouseReleaseEvent(event)
```
在使用时,可以通过set_image方法设置要显示的图片路径,然后通过鼠标框选矩形,最后在控制台输出矩形在图片上的坐标。
pyqt5 graphicsView 加载显示图片,在图片上鼠标框选红色矩形并返回矩形在图片上的实际坐标
你可以通过以下步骤实现:
1. 创建一个 QGraphicsScene 对象,并将其设置为 GraphicsView 的场景;
2. 使用 QGraphicsPixmapItem 在 QGraphicsScene 中加载你的图片;
3. 实现一个自定义的 QGraphicsRectItem,用于绘制红色矩形,并将其添加到 QGraphicsScene 中;
4. 通过 QGraphicsView 的鼠标按下和松开事件,获取鼠标的起始和结束位置,并将其转换为 QGraphicsScene 坐标系下的位置;
5. 计算矩形的坐标并返回。
以下是一个简单的示例代码:
```python
from PyQt5.QtCore import Qt, QPointF, QRectF
from PyQt5.QtGui import QPixmap, QColor, QPainter
from PyQt5.QtWidgets import QGraphicsView, QGraphicsScene, QGraphicsPixmapItem, QGraphicsRectItem, QApplication
class ImageWidget(QGraphicsView):
def __init__(self):
super().__init__()
# 创建一个 QGraphicsScene
self.scene = QGraphicsScene(self)
self.setScene(self.scene)
# 加载图片
self.pixmap_item = QGraphicsPixmapItem(QPixmap('your_image_path'))
self.scene.addItem(self.pixmap_item)
# 创建一个自定义的矩形项
self.rect_item = MyRectItem()
self.rect_item.setPen(QColor(255, 0, 0)) # 设置红色边框
self.rect_item.hide() # 初始隐藏
self.scene.addItem(self.rect_item)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
# 鼠标左键按下时,记录起始位置
self.start_pos = self.mapToScene(event.pos())
self.rect_item.setRect(QRectF(self.start_pos, QSizeF()))
self.rect_item.show()
def mouseMoveEvent(self, event):
# 鼠标移动时,更新矩形大小
if event.buttons() == Qt.LeftButton:
end_pos = self.mapToScene(event.pos())
self.rect_item.setRect(QRectF(self.start_pos, end_pos).normalized())
def mouseReleaseEvent(self, event):
# 鼠标释放时,计算矩形坐标并返回
if event.button() == Qt.LeftButton:
end_pos = self.mapToScene(event.pos())
rect = QRectF(self.start_pos, end_pos).normalized()
rect_in_pixmap = self.pixmap_item.mapFromScene(rect)
print('矩形在图片上的实际坐标:', rect_in_pixmap.toRect())
class MyRectItem(QGraphicsRectItem):
def paint(self, painter, option, widget=None):
# 重写 paint 方法,使矩形中间透明
painter.setPen(self.pen())
painter.setBrush(QColor(255, 0, 0, 50))
painter.drawRect(self.rect())
if __name__ == '__main__':
app = QApplication([])
widget = ImageWidget()
widget.show()
app.exec_()
```
这段代码演示了如何在 PyQt5 的 GraphicsView 中加载图片,并在图片上鼠标框选红色矩形,最后返回矩形在图片上的实际坐标。
阅读全文