You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QRect工作原理及坐标偏移、宽度计算异常问题咨询

QRect 坐标与尺寸的疑惑解析

问题代码与输出

代码

std::vector<QPoint> points;
points.push_back({3, 1});
points.push_back({6, 1});
points.push_back({6, 4});
points.push_back({3, 4});

QRect rect(points[0], QSize{points[1].x() - points[0].x(), points[2].y() - points[1].y()});

qDebug() << rect << rect.topLeft() << rect.topRight() << rect.bottomRight() << rect.bottomLeft() << rect.width() << rect.height();

运行输出

QRect(3,1 3x3) QPoint(3,1) QPoint(5,1) QPoint(5,3) QPoint(3,3) 3 3

用户疑问

  • 原本预期的右上角(6,1)变成了(5,1),其他角落坐标也有类似偏移;
  • 宽度显示为3,但用topRight().x() - topLeft().x()计算得到2,和显示的宽度矛盾;
  • 想了解QRect的工作机制及该现象的成因。

解析

QRect的核心特性是左闭右开的坐标模型,这是所有疑问的根源:

  1. 坐标偏移的本质
    QRect的topRight()、bottomRight()等方法返回的是矩形的边界终点(开区间端点),而非矩形包含的最后一个像素点。比如你创建的矩形左上角为(3,1),宽度3,它覆盖的x范围是3 ≤ x < 6——也就是说,x=3、4、5是矩形内的有效坐标,x=6是边界外的点。因此topRight()的x坐标是5(6-1),同理y方向高度3,覆盖1 ≤ y < 4,所以bottomRight()的y坐标是3(4-1)。

  2. 尺寸计算的逻辑
    你构造QRect时传入的宽度是6-3=3,QRect的width()直接返回这个值,或者通过右边界x - 左边界x计算(6-3=3)。而用topRight().x() - topLeft().x()得到5-3=2,是因为topRight().x()是开区间的端点,并非矩形内的最大x值,所以这个计算方式不适合用来验证QRect的宽度。

  3. 构造逻辑匹配
    你创建的QRect(3,1,3,3)(等价于代码中的构造方式),对应的实际覆盖区域是:

  • x轴:3 ≤ x < 6
  • y轴:1 ≤ y < 4
    这个区域包含3个x坐标(3、4、5)和3个y坐标(1、2、3),和宽度、高度为3的结果完全匹配。

简单来说,QRect的设计是为了图形绘制中的区间计算效率,采用左闭右开模型,所有角落坐标的“偏移”都是这个模型的正常表现,并非异常。


内容的提问来源于stack exchange,提问作者KcFnMi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:25:46