在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。
