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的核心特性是左闭右开的坐标模型,这是所有疑问的根源:
坐标偏移的本质
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)。尺寸计算的逻辑
你构造QRect时传入的宽度是6-3=3,QRect的width()直接返回这个值,或者通过右边界x - 左边界x计算(6-3=3)。而用topRight().x() - topLeft().x()得到5-3=2,是因为topRight().x()是开区间的端点,并非矩形内的最大x值,所以这个计算方式不适合用来验证QRect的宽度。构造逻辑匹配
你创建的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
相关产品推荐
相关产品推荐

