一直在與QRect和QRectF打交道。
甚至在使用過程中因為QRect而出現了致命的Bug。
因為QRect在數據存儲表示上有一個很大的“歷史遺留問題”!
QRect Class

也就是說,對於QRect來說,使用TopLeft獲得的是正確的左上角坐標,但是其BottomRight()坐標是不正確的!
對比QRectF就很清晰了.
對比QRectF就很清晰了.
QRectF Class

例子
拿一個例子來對比,假設有一個矩形左上角為(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(QPoint topLeft, QPoint bottomRight)
- QRect(int x, int y, int width, int height)