获取QGraphicsRectItem内的rect()相对于场景的坐标

1.概要

// 将矩形的左上角和右下角转换为场景坐标  
QPointF topLeftInScene = rectItem->mapToScene(rectInItem.topLeft()); 

2.内容

要获取QGraphicsRectItem内的rect()相对于场景的坐标,你需要将rect()返回的矩形(它是相对于QGraphicsRectItem的局部坐标系的)转换为场景坐标系中的矩形。这通常涉及到将矩形的每个顶点或边界通过QGraphicsItemmapToScene()方法转换到场景坐标系。

以下是一个具体的步骤和示例代码:

  1. 获取QGraphicsRectItem的矩形
    使用rect()方法获取QGraphicsRectItem在其局部坐标系中的矩形。

  2. 将矩形的每个角点转换为场景坐标
    使用mapToScene()方法将矩形的左上角(通常是rect().topLeft())和右下角(通常是rect().bottomRight())转换为场景坐标。如果你需要更精确的边界,也可以转换其他点,比如中点或者每条边的中点。

  3. 构造场景坐标系中的矩形
    使用转换后的点来构造一个新的QRectF,这个矩形就是在场景坐标系中的。

以下是一个C++示例代码:

QGraphicsRectItem* rectItem = ...; // 假设你已经有一个QGraphicsRectItem的指针  
QRectF rectInItem = rectItem->rect(); // 获取QGraphicsRectItem的局部矩形  
  
// 将矩形的左上角和右下角转换为场景坐标  
QPointF topLeftInScene = rectItem->mapToScene(rectInItem.topLeft());  
QPointF bottomRightInScene = rectItem->mapToScene(rectInItem.bottomRight());  
  
// 构造场景坐标系中的矩形  
QRectF rectInScene(topLeftInScene, bottomRightInScene);  
  
// 现在rectInScene包含了QGraphicsRectItem在场景坐标系中的矩形

请注意,如果QGraphicsRectItem被旋转或缩放了,那么简单地转换左上角和右下角可能不足以准确描述转换后的矩形。在这种情况下,你可能需要转换矩形的所有四个角,并使用这些点来构造一个更精确的边界矩形。

另外,如果你只是想获取矩形的一个特定点(比如中心点)在场景中的位置,你可以直接使用mapToScene()方法转换那个点。

最后,请确保在调用mapToScene()之前,QGraphicsRectItem已经被添加到了QGraphicsScene中,因为转换依赖于图形项在场景中的位置和方向。

mapToScene

mapToScene 是 QGraphicsItem 类(及其子类,如 QGraphicsRectItem)中的一个非常重要的方法,它用于将图形项局部坐标系中的点或矩形转换为场景(QGraphicsScene)的全局坐标系中的对应点或矩形。

当你有一个图形项,比如一个 QGraphicsRectItem,并且你想知道这个图形项内部的某个点或者整个矩形在场景中的确切位置时,你就需要使用 mapToScene 方法。

使用 mapToScene 转换点

如果你有一个 QGraphicsRectItem 并且你想获取它内部某个点(比如中心点)在场景中的坐标,你可以这样做:

QGraphicsRectItem* rectItem = ...; // 假设你有一个指向 QGraphicsRectItem 的指针  
QPointF pointInItem = rectItem->rect().center(); // 获取矩形中心点,这是局部坐标  
QPointF pointInScene = rectItem->mapToScene(pointInItem); // 转换为场景坐标

使用 mapToScene 转换矩形

如果你想将整个 QGraphicsRectItem 的矩形边界转换为场景坐标,你需要转换矩形的每个角点,然后使用这些点来构造一个新的 QRectF

QGraphicsRectItem* rectItem = ...; // 假设你有一个指向 QGraphicsRectItem 的指针  
QRectF rectInItem = rectItem->rect(); // 获取图形项的局部矩形  
  
// 转换矩形的四个角点到场景坐标  
QPointF topLeftInScene = rectItem->mapToScene(rectInItem.topLeft());  
QPointF topRightInScene = rectItem->mapToScene(rectInItem.topRight());  
QPointF bottomLeftInScene = rectItem->mapToScene(rectInItem.bottomLeft());  
QPointF bottomRightInScene = rectItem->mapToScene(rectInItem.bottomRight());  
  
// 使用转换后的点构造场景坐标系中的矩形  
QRectF rectInScene(topLeftInScene, QSizeF(bottomRightInScene.x() - topLeftInScene.x(), bottomRightInScene.y() - topLeftInScene.y()));

然而,通常你不需要手动转换每个角点,因为 QGraphicsItem 类提供了一个重载的 mapToScene 方法,可以直接转换整个 QRectF

QRectF rectInScene = rectItem->mapToScene(rectInItem).boundingRect();

这里使用 boundingRect 是因为 mapToScene(const QRectF &rect) 返回的是一个 QPainterPath,它表示转换后的形状。通过调用 boundingRect,我们可以得到一个包含该形状的 QRectF。但是,请注意,如果图形项被旋转或缩放了,boundingRect 可能不会紧密地包围转换后的矩形,而是会返回一个包含整个旋转或缩放后形状的边界矩形。

在大多数情况下,如果你只是想知道图形项在场景中的大致位置或边界,使用 mapToScene 转换矩形的左上角和右下角就足够了。如果你需要更精确的形状,你可能需要考虑图形项的变换(如旋转、缩放等)并相应地调整你的计算。

猜你喜欢

转载自blog.csdn.net/xie__jin__cheng/article/details/143487149