PyQt5 QRect和QRectF
在Qt的使用过程中不免要与QRect和QRectF打交道。
但是,QRect在数据存储表示上有一个很大的“历史遗留问题”!
引申自QtAssistent对QRect的一段话:
注意,由于历史原因,bottom()和right()函数返回的值偏离了矩形的真正的右下角:right()函数返回left() + width() - 1, bottom()函数返回top() + height() - 1。bottomRight()函数返回的点也是如此。此外,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。
相关文章
文章评论
-
-
-