首页 > 其他分享 >获取QGraphicsRectItem内的矩形的坐标,坐标是相对于整个场景的

获取QGraphicsRectItem内的矩形的坐标,坐标是相对于整个场景的

时间:2024-09-06 19:20:57浏览次数:13  
标签:缩放 QRectF rectItem QGraphicsRectItem 矩形 坐标

要点

一个QGraphicsRectItem的坐标,受两个因素影响,QGraphicsRectItem本身针对于场景的坐标,QGraphicsRectItem内的矩形相对于这一点的坐标。

获取QGraphicsRectItem的坐标

在 Qt 中,QGraphicsRectItem 是 QGraphicsItem 的一个子类,用于表示矩形图形项。要获取 QGraphicsRectItem 的坐标,你可以使用 QGraphicsItem 类的 pos() 方法,该方法返回一个 QPointF 对象,表示图形项在其父坐标系统中的位置。

以下是一个简单的示例,展示如何获取 QGraphicsRectItem 的坐标:

#include <QGraphicsRectItem>  
#include <QPointF>  
#include <QDebug>  
  
// 假设你已经有了一个 QGraphicsRectItem 对象,这里我们将其命名为 rectItem  
QGraphicsRectItem *rectItem = new QGraphicsRectItem(QRectF(0, 0, 100, 100));  
  
// 设置 rectItem 的位置  
rectItem->setPos(50, 100);  
  
// 获取 rectItem 的位置  
QPointF position = rectItem->pos();  
qDebug() << "RectItem Position:" << position;

在这个例子中,rectItem->pos() 将返回一个 QPointF 对象,其中包含了 QGraphicsRectItem 的坐标。QPointF 对象有两个属性:x() 和 y(),分别表示横坐标和纵坐标。通过 qDebug() 可以打印出这些坐标值。

请注意,这里的坐标是相对于其父项或场景的坐标,具体取决于你的 QGraphicsRectItem 是如何被添加到场景中的。如果你想要获取相对于整个场景的坐标,你需要考虑所有父级项的变换和位置。

获取QGraphicsRectItem内的矩形坐标 

在 Qt 中,QGraphicsRectItem 表示一个矩形图形项,它自身有一个矩形区域,这个区域是相对于图形项自身坐标系的。要获取 QGraphicsRectItem 内部的矩形坐标,你可以使用 rect() 方法,它返回一个 QRectF 对象,该对象描述了图形项的矩形边界。

以下是一个简单的示例,展示如何获取 QGraphicsRectItem 内的矩形坐标:

#include <QGraphicsRectItem>  
#include <QRectF>  
#include <QDebug>  
  
int main() {  
    // 创建一个 QGraphicsRectItem 对象,并指定其矩形区域  
    QGraphicsRectItem *rectItem = new QGraphicsRectItem(QRectF(10, 20, 80, 50));  
  
    // 假设 rectItem 已经被添加到 QGraphicsScene 中,并且可能已经被移动或变换  
  
    // 获取 rectItem 内部的矩形坐标  
    QRectF rect = rectItem->rect();  
    qDebug() << "RectItem internal rectangle:" << rect;  
  
    // 清理资源  
    delete rectItem;  
  
    return 0;  
}

在这个例子中,rectItem->rect() 返回的 QRectF 对象包含了 QGraphicsRectItem 内部的矩形坐标。这个矩形是相对于图形项自身的坐标系的,也就是说,它不考虑图形项在场景中的位置(pos())或者任何应用的变换(如旋转或缩放)。

如果你想要获取这个矩形在场景坐标系中的位置,你需要结合图形项的位置(pos())和任何可能的变换来计算。例如,如果你想要获取矩形左上角在场景中的坐标,你可以这样做:

QPointF topLeftInScene = rectItem->pos() + rectItem->rect().topLeft();  
qDebug() << "RectItem top-left corner in scene coordinates:" << topLeftInScene;

这里,rectItem->pos() 返回图形项在场景中的位置,rectItem->rect().topLeft() 返回矩形左上角的坐标(相对于图形项自身),两者相加就得到了矩形左上角在场景坐标系中的坐标。

 获取QGraphicsRectItem内的一个矩形,在整个场景内的坐标

在Qt中,要获取QGraphicsRectItem内的矩形在整个场景内的坐标,你需要将矩形相对于图形项的位置(rect()方法返回)与图形项在场景中的位置(pos()方法返回)结合起来。rect()方法返回一个QRectF,它表示图形项自身的矩形区域(在图形项坐标系中),而pos()方法返回一个QPointF,表示图形项在父坐标系(通常是场景坐标系)中的位置。

以下是一个示例代码,展示了如何计算QGraphicsRectItem内的矩形在整个场景中的坐标:


#include <QGraphicsRectItem>  
#include <QRectF>  
#include <QPointF>  
#include <QDebug>  
  
int main() {  
    // 创建一个 QGraphicsRectItem 对象,并指定其在场景中的位置  
    QGraphicsRectItem *rectItem = new QGraphicsRectItem();  
    rectItem->setRect(QRectF(0, 0, 100, 50)); // 设置图形项内部的矩形大小  
    rectItem->setPos(50, 100); // 设置图形项在场景中的位置  
  
    // 假设 rectItem 已经被添加到 QGraphicsScene 中  
  
    // 获取 rectItem 内部的矩形(相对于图形项自身)  
    QRectF rectInItem = rectItem->rect();  
  
    // 获取 rectItem 在场景中的位置  
    QPointF posInScene = rectItem->pos();  
  
    // 计算矩形在场景中的坐标  
    QRectF rectInScene = QRectF(posInScene, rectInItem.size());  
    // 或者使用另一种方式,通过移动矩形的左上角到场景中的位置  
    // QRectF rectInScene = rectInItem.translated(posInScene);  
  
    qDebug() << "Rect in scene coordinates:" << rectInScene;  
  
    // 清理资源  
    delete rectItem;  
  
    return 0;  
}

在这个例子中,rectInSceneQGraphicsRectItem内的矩形在整个场景中的坐标。它是通过创建一个新的QRectF对象,其左上角位置设置为图形项在场景中的位置(posInScene),大小设置为图形项内部矩形的大小(rectInItem.size())。另一种方法是使用QRectF::translated()函数,它接受一个QPointF作为参数,并返回一个新矩形,该矩形是原始矩形移动了指定位置后的结果。

请注意,这个例子假设没有应用任何变换(如旋转或缩放)到QGraphicsRectItem上。如果应用了变换,你需要使用QGraphicsItem::sceneTransform()来获取变换矩阵,并将其应用到矩形的坐标上,以得到正确的场景坐标。

 

获取QGraphicsRectItem内的矩形的x坐标,坐标是相对于整个场景的 

在 Qt 中,如果你想要获取 QGraphicsRectItem 内的矩形左上角的 x 坐标,并且这个坐标是相对于整个场景的,你可以通过结合图形项在场景中的位置(pos())和图形项自身的矩形(rect())来计算。

以下是一个简单的计算示例:

#include <QGraphicsRectItem>  
#include <QRectF>  
#include <QPointF>  
#include <QDebug>  
  
// 假设你已经有了一个 QGraphicsRectItem 的实例 rectItem  
QGraphicsRectItem *rectItem = ...; // rectItem 应该是已经创建并添加到场景中的 QGraphicsRectItem 对象  
  
// 获取 rectItem 在场景中的位置  
QPointF itemPositionInScene = rectItem->pos();  
  
// 获取 rectItem 自身的矩形区域  
QRectF rectInItem = rectItem->rect();  
  
// 计算矩形左上角的 x 坐标,相对于整个场景  
qreal xCoordInScene = itemPositionInScene.x() + rectInItem.left();  
  
qDebug() << "RectItem's rectangle left x-coordinate in scene:" << xCoordInScene;

在这个例子中,itemPositionInScene 是 QGraphicsRectItem 在场景中的位置,rectInItem 是图形项内部的矩形区域。rectInItem.left() 返回矩形左侧的 x 坐标(相对于图形项自身),与图形项在场景中的 x 坐标相加,即可得到矩形左上角在场景中的 x 坐标。

请注意,这个计算假设 QGraphicsRectItem 没有被旋转或缩放。如果图形项被旋转或缩放,那么计算会变得更加复杂,需要考虑变换矩阵。如果图形项只进行了平移,上面的方法仍然有效。

 矩形可能发生缩放,但没有旋转,请完善上面的问题

如果QGraphicsRectItem内的矩形可能发生了缩放,但没有旋转,你可以通过以下方式来获取矩形左上角在场景中的x坐标,同时考虑缩放的影响:

#include <QGraphicsRectItem>  
#include <QRectF>  
#include <QPointF>  
#include <QTransform>  
#include <QDebug>  
  
// 假设 rectItem 是已经创建并添加到场景中的 QGraphicsRectItem 对象  
QGraphicsRectItem *rectItem = ...;  
  
// 获取 rectItem 在场景中的位置  
QPointF itemPositionInScene = rectItem->pos();  
  
// 获取 rectItem 自身的矩形  
QRectF rectInItem = rectItem->rect();  
  
// 获取 rectItem 的缩放变换(假设没有旋转)  
QTransform transform = rectItem->transform();  
  
// 考虑缩放变换,计算缩放后的矩形左上角在场景坐标系中的位置  
QPointF scaledTopLeft = transform.map(rectInItem.topLeft());  
QPointF topLeftInScene = itemPositionInScene + scaledTopLeft;  
  
// 获取矩形左上角的 x 坐标,相对于整个场景  
qreal xCoordInScene = topLeftInScene.x();  
  
qDebug() << "Scaled RectItem's rectangle left x-coordinate in scene:" << xCoordInScene;

在这个例子中,我们使用了QGraphicsItem::transform()方法来获取图形项的变换矩阵。由于假设没有旋转,这个变换矩阵主要反映了缩放操作。我们使用QTransform::map()方法来应用这个变换到矩形左上角的原始坐标上,从而得到缩放后的坐标。然后,我们将缩放后的左上角坐标与图形项在场景中的位置相加,以得到矩形左上角在场景坐标系中的位置。最后,我们从结果中提取x坐标。

请注意,这种方法仅适用于没有旋转的情况。如果旋转也被应用到了图形项上,那么就需要一个更复杂的计算来确定矩形在场景中的准确位置。

如果QRectF发生了缩放,QRectF的left()的值回发生变化吗 

当 QRectF 对象本身被缩放时,其 left() 方法的值实际上不会发生变化。left() 方法返回的是矩形左边的 x 坐标,这个坐标是相对于矩形的左上角的,而缩放操作通常不会改变矩形左上角的位置。

但是,这里有一个重要的区别需要弄清楚:QRectF 本身只是一个表示矩形的类,它不包含任何变换信息。当你对一个 QRectF 对象进行缩放时,你实际上是在创建一个新的变换后的矩形,而不是修改原始矩形的坐标。这通常是通过将 QRectF 与 QTransform 结合使用来实现的。

举个例子,如果你有一个 QRectF 对象表示一个矩形,并且你想要缩放这个矩形,你需要做的是创建一个 QTransform 对象,设置其缩放因子,然后使用这个变换对象的 mapRect 方法来得到变换后的矩形。

QRectF rect(0, 0, 100, 50);  // 原始矩形  
QTransform transform;  
transform.scale(2, 2);  // 水平和垂直方向都放大2倍  
  
QRectF transformedRect = transform.mapRect(rect);  // 变换后的矩形

在这个例子中,rect 的 left() 方法仍然会返回 0,因为原始矩形的左上角位置没有改变。但是,transformedRect 的宽度和高度将会是原始矩形的两倍,即 200x100,而它的左上角位置(相对于原始坐标系)也可能会发生变化,这取决于缩放操作是如何应用的(比如是否围绕某个中心点进行缩放)。但是,如果我们只是简单地看 transformedRect.left(),它仍然会返回变换后矩形的左上角的 x 坐标,这个坐标在大多数情况下会是 0(除非缩放操作还包含了平移)。

总结一下,QRectF 对象的 left() 方法返回的是该矩形左上角的 x 坐标,这个坐标在矩形被缩放时通常不会改变(除非缩放操作同时包含了平移),但是你应该注意到缩放操作通常会生成一个新的矩形,而不是修改原始矩形的坐标。

 QTransform

QTransform 是 Qt 框架中的一个类,它用于在二维空间中进行坐标变换。这个类提供了一种方式来描述变换操作,如平移(translation)、缩放(scaling)、旋转(rotation)以及剪切(shear)等,这些操作可以单独使用,也可以组合使用来实现更复杂的变换效果。

主要功能

QTransform 类支持以下几种基本的坐标变换:

  1. 平移(Translation):通过指定水平和垂直方向上的位移量来移动坐标系中的点。
  2. 缩放(Scaling):通过指定水平和垂直方向上的缩放因子来改变坐标系中点的尺寸。
  3. 旋转(Rotation):通过指定旋转角度和旋转中心来旋转坐标系中的点。
  4. 剪切(Shear):通过指定水平和垂直方向上的剪切因子来使坐标系中的点发生倾斜变形。

使用示例

下面是一个简单的示例,展示了如何使用 QTransform 来进行坐标变换:

代码
#include <QTransform>  
#include <QPointF>  
#include <QDebug>  
  
int main() {  
    // 创建一个初始点  
    QPointF point(1, 1);  
  
    // 创建一个 QTransform 对象  
    QTransform transform;  
  
    // 对变换对象进行平移、缩放和旋转操作  
    transform.translate(2, 3);  // 平移  
    transform.scale(2, 2);      // 缩放  
    transform.rotate(45);       // 旋转45度  
  
    // 应用变换到点上  
    QPointF transformedPoint = transform.map(point);  
  
    // 输出变换后的点坐标  
    qDebug() << "Transformed point:" << transformedPoint;  
  
    return 0;  
}

运行结果

Transformed point: QPointF(2,5.82843)

在这个示例中,我们首先创建了一个初始点 (1, 1),然后创建了一个 QTransform 对象,并对这个对象进行了一系列的变换操作(平移、缩放和旋转)。最后,我们使用 map 方法将这些变换应用到初始点上,并输出变换后的点的坐标。

注意事项

  • 变换的顺序很重要。例如,先进行旋转再进行平移和先进行平移再进行旋转的结果通常是不同的。
  • QTransform 类还提供了矩阵操作,允许你直接操作底层的变换矩阵,以实现更复杂的变换效果。
  • 当处理图形和界面元素时,QTransform 通常与 Qt 的绘图类(如 QPainter)结合使用,以实现图形元素的动态变换。

 QRectF

QRectF 是 Qt 框架中的一个类,它表示一个二维矩形,并使用浮点数来定义其位置和大小。与 QRect 不同(QRect 使用整数),QRectF 提供了更高的精度,适用于需要精确布局的图形操作。

主要属性

QRectF 类的主要属性包括:

  • x(): 返回矩形左上角的 x 坐标。
  • y(): 返回矩形左上角的 y 坐标。
  • width(): 返回矩形的宽度。
  • height(): 返回矩形的高度。
  • topLeft(): 返回矩形左上角的点(QPointF)。
  • bottomRight(): 返回矩形右下角的点(QPointF)。
  • topRight(): 返回矩形右上角的点(QPointF)。
  • bottomLeft(): 返回矩形左下角的点(QPointF)。
  • center(): 返回矩形的中心点(QPointF)。

构造函数

QRectF 提供了多个构造函数,允许你以不同的方式创建矩形:

  • 使用左上角的点和大小来构造矩形。
  • 使用左上角的点和右下角的点来构造矩形。
  • 使用四个浮点数(x, y, width, height)来构造矩形。
  • 使用另一个 QRectF 对象来复制构造一个新的矩形。

操作方法

QRectF 类提供了许多操作方法,允许你对矩形进行平移、缩放、旋转等变换,以及检查点是否在矩形内、矩形是否与其他矩形相交等。

  • translate(): 平移矩形。
  • scale(): 缩放矩形。
  • rotate(): 旋转矩形。
  • contains(): 检查一个点或另一个矩形是否在当前矩形内。
  • intersects(): 检查当前矩形是否与另一个矩形相交。
  • united(): 返回包含当前矩形和另一个矩形的最小矩形。
  • intersected(): 返回当前矩形和另一个矩形的交集。

示例

下面是一个简单的示例,展示了如何使用 QRectF


#include <QRectF>  
#include <QPointF>  
#include <QDebug>  
  
int main() {  
    // 创建一个 QRectF 对象,指定左上角的点和大小  
    QRectF rect(10.0, 20.0, 100.0, 50.0);  
  
    // 输出矩形的属性  
    qDebug() << "x:" << rect.x();  
    qDebug() << "y:" << rect.y();  
    qDebug() << "width:" << rect.width();  
    qDebug() << "height:" << rect.height();  
  
    // 检查一个点是否在矩形内  
    QPointF point(50.0, 40.0);  
    if (rect.contains(point)) {  
        qDebug() << "Point is inside the rectangle.";  
    } else {  
        qDebug() << "Point is outside the rectangle.";  
    }  
  
    return 0;  
}

在这个示例中,我们创建了一个 QRectF 对象,并输出了它的属性。然后,我们检查了一个点是否在矩形内,并输出了相应的结果。

 QTransform::Scaling

 

QTransform::Scaling 是 Qt 框架中 QTransform 类用于描述二维变换的一个枚举值或者操作,特别是与缩放变换(Scaling)相关的。在二维图形处理中,缩放是指调整对象的大小,通常通过指定水平和垂直方向的缩放因子来实现。

QTransform 类

QTransform 类提供了对二维坐标变换的支持,包括平移(translation)、旋转(rotation)、缩放(scaling)和剪切(shearing)等操作。这个类主要用于图形视图框架(如 QGraphicsView)、绘图(如 QPainter)以及任何需要二维坐标变换的场合。

缩放(Scaling)

在 QTransform 中,缩放操作通常通过 scale 方法实现,该方法允许你指定水平(x 轴)和垂直(y 轴)方向的缩放因子。例如:

QTransform transform;  
transform.scale(2.0, 1.5);  // 水平方向放大2倍,垂直方向放大1.5倍

当你对一个对象(如图像、形状或图形元素)应用这样的变换时,它的尺寸会按照指定的缩放因子进行相应的调整。

示例

以下是一个简单的示例,展示如何使用 QTransform 对一个矩形进行缩放:

#include <QTransform>  
#include <QRectF>  
#include <QDebug>  
  
int main() {  
    QRectF rect(0, 0, 100, 50);  // 原始矩形:100x50  
    QTransform transform;  
    transform.scale(2, 2);  // 放大2倍  
  
    QRectF transformedRect = transform.mapRect(rect);  
    qDebug() << transformedRect;  // 输出:QRectF(0,0 200x100)  
    return 0;  
}

在这个例子中,我们首先创建了一个 100x50 的矩形,然后定义了一个 QTransform 对象,并将其缩放因子设置为 2(即水平和垂直方向都放大 2 倍)。通过 mapRect 方法,我们将原始矩形映射到变换后的坐标系中,结果是一个 200x100 的矩形。

总结

QTransform::Scaling 是 Qt 中用于二维图形缩放变换的一个功能或者操作,通过 QTransform 类的 scale 方法可以方便地实现对象的缩放。这个功能在图形编辑、游戏开发、用户界面设计等领域非常有用。

 

标签:缩放,QRectF,rectItem,QGraphicsRectItem,矩形,坐标
From: https://blog.csdn.net/xie__jin__cheng/article/details/141932785

相关文章

  • 是坐标转换,也是旋转——矩阵变换
    坐标转换一个向量可以被表示为\(v=xi+yj+zk\),其中\(i\),\(j\),\(k\)为坐标系的基向量:\(i=\begin{bmatrix}1\\0\\0\end{bmatrix}\),\(j=\begin{bmatrix}0\\1\\0\end{bmatrix}\),\(k=\begin{bmatrix}0\\0\\1\end{bmatrix}\)基向量可写成矩阵的方式:\(\begin......
  • 只有经纬高坐标系下的飞行数据,怎么转换得到姿态角?
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ConvertsLLA(Latitude,Longitude,Altitude)datatoanextendedstate%vectorincludingattitude(psi,theta,phi).%%ConversionProcess:%1.ConvertLLAtoECEF(Earth......
  • OPenCV结构分析与形状描述符(3)计算一个点集的最小外接矩形的函数boundingRect()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述计算一个点集的最小右上边界矩形或灰度图像中的非零像素。该函数计算并返回指定点集或灰度图像中非零像素的最小右上边界矩形。在OpenCV中,boundingRect函数用于找到一个点集的最......
  • WGS84、BD09、GCJ02坐标转换
    名词解释WGS84此坐标系解释参考笔者另一篇博客GIS坐标系、投影与转换GCJ02GCJ-02是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统。是中国大陆地区的地图数据使用的坐标系。基于WGS84进行加密后形成。BD09BD09是中国的百度地图......
  • ABB工具坐标系报错质心重量不适配问题
    机器人在运行时为了避免机器人(如传动装置和轴承)出现过载。必须输入正确的负载数据(质量、重心位置、惯性矩),也就是进行负载测试。对于ABB机器人来说,负载测试的方法如下:1、在【主菜单】下,打开【程序编辑器】;   2、选择一个程序,如main程序。点击【调试】;  3、点击......
  • 代码随想录day49 || 42、接雨水 84、柱状图中最大的矩形
    42、接雨水functrap(height[]int)int{ //双指针思路,按照列计算雨水高度,分别计算每一列左右高于当前高度的最高柱子高度,然后通过min(left,right)-height[i]得出当前列的雨水体积 varresint varleft,rightint fori:=1;i<len(height)-1;i++{ left,right=......
  • OpenCV绘图函数(15)图像上绘制矩形函数 rectangle()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述绘制一个简单的、粗的或填充的直立矩形。这个函数cv::rectangle绘制一个矩形轮廓或一个填充的矩形,其两个相对的顶点分别是pt1和pt2。函数原型1voidcv::rectangle( Inpu......
  • 在对数坐标系中绘制函数图象
    本文记述了用Matplotlib在对数坐标系中绘制图象的一种方法,并在以2为底的对数坐标系上展示了选择排序、冒泡排序(二)、快速排序(四)的性能数据图象。笔者按如下布局绘制了12(4x3)幅图象,其中[a,b]代表某幅图象的位置。+---------------+---------------+---------------+|......
  • 【法如faro】三维激光软件Scene2023数据处理(自动配准并转换坐标)流程
    Scene2023数据处理(自动配准并转换坐标)的主要流程为:新建项目、导入数据、处理、自动注册、坐标系转换、模型导出立和面模型导出等。文章目录一、新建项目二、导入数据三、处理四、自动注册五、坐标系转换六、模型导出七、立面模型导出八、创建项目点云九、导......
  • 使用广播星历计算卫星坐标(Python)
    前言本代码为GNSS课程设计代码,仅供参考,使用的计算方法与公式均来源于王坚主编的《卫星定位原理与应用(第二版)》。本代码计算结果可以通过下载精密星历进行比照,误差在1-10m左右。实现功能:读取卫星广播星历,并将其计算为WGS-84坐标系下的坐标,每颗卫星,每15分钟输出一次。广播星历......