码迷,mamicode.com
首页 > 其他好文 > 详细

QRect与QRectF的区别

时间:2020-10-21 21:07:57      阅读:29      评论:0      收藏:0      [点我收藏+]

标签:偏移量   方案   避免   坐标   col   有一个   数据存储   ott   adjust   

    在Qt的使用过程中不免要与QRect和QRectF打交道。

    但是,QRect在数据存储表示上有一个很大的“历史遗留问题”!

    引申自QtAssistent对QRect的一段话:

    注意,由于历史原因,bottom()和right()函数返回的值偏离了矩形的真正的右下角:right()函数返回left() + width() - 1, bottom()函数返回top() + height() - 1bottomRight()函数返回的点也是如此。此外,topRight()函数和bottomLeft()函数的x坐标和y坐标分别包含与真正的右下角和右下角相同的偏差
    我们建议您使用x() + width()和y() + height()来找到真正的右下角,并避免使用right()和bottom()。另一种解决方案是使用QRectF: QRectF类使用坐标的浮点精度在平面中定义一个矩形,并且QRectF::right()和QRectF::bottom()函数确实返回右坐标和底部坐标。
    还可以使用adjust()函数向这个矩形的坐标添加偏移量,以及使用adjusted()函数根据原始矩形的调整检索一个新矩形。如果宽度和高度都为负,则使用规范化()函数检索交换角的矩形。
    此外,QRect提供getCoords()函数,该函数提取矩形的左上角和右下角的位置,getRect()函数提取矩形的左上角、宽度和高度。使用setCoords()和setRect()函数一次性操作矩形的坐标和维度。

技术图片

    也就是说,对于QRect来说,只有使用TopLeft()获得的才是正确的左上角坐标。

    例子:

    拿一个例子来对比,假设有一个矩形左上角为(0, 0),长宽都为100.那么我们期待的一个矩形的左上角和右下角应该是

(0, 0)

(100, 100)。

   但,如果用构造函数QRect(0, 0, 100, 100)会得到:

左上角(0, 0)

右下角(0, 99)

    而对于构造函数QRectF(0, 0, 100, 100)会得到:

左上角(0.0, 0.0)

右下角(0.0, 100.0)

    但是,这里的QRect和QRectF在实际绘制过程中会重叠,也就是说他们实际上是一样的。

    所以文档才建议,或者你可以使用QRectF,否则就要把这个陷阱铭记于心。
    同时构造QRect的时候,建议使用。

QRect(int x, int y, int width, int height)
    同时在代码中避免使用QRect的:right()、bottom()相关函数。
    或者,将错就错,在构造时候使用了TopLeft和BottomRight,那么就记得要+1或者-1,或者在后续使用过程中对获得的Width或者Height进行+/-1。

QRect与QRectF的区别

标签:偏移量   方案   避免   坐标   col   有一个   数据存储   ott   adjust   

原文地址:https://www.cnblogs.com/f-wind/p/13852008.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!