凌的博客

您现在的位置是: 首页 > 学无止境 > python > 

python

PyQt5 QRect和QRectF

2019-10-05 python 4757

在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()函数一次性操作矩形的坐标和维度。


1.png


    也就是说,对于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。

文章评论

0条评论