QRect矩形描述總結
- 一、概述
- 二、常用函數
- 1. 移動類
- 2. 屬性函數
- 3. 判斷
- 4. 比較計算
- 三、渲染
- 三、坐標
一、概述
QRect類使用整數精度在平面中定義一個矩形。在繪圖的時候經常使用,作為一個二維的參數描述類。
一個矩形主要有兩個重要屬性,一個是坐標(x,y),一個是尺寸(長寬)。所以QRect的構造函數也是這樣描述的。
QRect可以用一組左、頂、寬、高整數來構造,也可以用QPoint和QSize來構造。下面的代碼創建了兩個相同的矩形。
QRect r1(100, 200, 11, 16);
QRect r2(QPoint(100, 200), QSize(11, 16));
還有第三個構造函數,它使用左上角和右下角的坐標創建QRect,但我們建議我們避免使用它。其基本原理是由于歷史原因,bottom()和right()函數返回的值偏離了矩形的真正右下角。
二、常用函數
QRect類提供了一組函數,這些函數返回各種矩形坐標,并支持對這些坐標的操作。
1. 移動類
QRect還提供了相對于各種坐標移動矩形的函數,以move開頭的函數都不會修改矩形的大小,只是改坐標值。
移動的要點在于移動的Rect的方向,看名稱就知道,移動會有矩形的四個角點,還會有X,Y方向。
- moveBottom(int y)
- moveBottomLeft(const QPoint &position)
- moveBottomRight(const QPoint &position)
- moveCenter(const QPoint &position)
- moveLeft(int x)
- moveRight(int x)
- moveTo(int x, int y)
- moveTo(const QPoint &position)
- moveTop(int y)
- moveTopLeft(const QPoint &position)
- moveTopRight(const QPoint &position)
translate()函數將矩形相對于當前位置移動給定的偏移量,translate()函數返回該矩形的轉換副本,這個參數是移動多少量,而move系列函數是移動到坐標。
2. 屬性函數
size() 函數的作用是:以QSize的形式返回矩形的維度。還可以使用width()和height()函數分別檢索尺寸。要操作尺寸,可以使用setSize()、setWidth()或setHeight()函數。也可以通過應用設置矩形坐標的函數之一來更改大小,例如setBottom()或setRight()。
相應的還有很多獲取矩形的坐標點,尺寸等屬性等函數。就像下面一樣,矩形的坐標點有topLeft、BottomRight等信息。
3. 判斷
- contains() :告訴給定的點是否在矩形內,
- intersects():判斷這個矩形與給定的矩形相交,
在圖形處理中,QRect類還提供了intersected()函數,該函數返回交點矩形,以及united()函數,該函數返回包含給定矩形和以下內容的矩形,有時候求面積的話就可以不用再自己寫了。下面是兩個函數的差別示意圖:
如果left() > right()或top() > bottom(),則isEmpty()函數返回true。請注意,空矩形是無效的:isValid()函數如果left() <= right()且top() <= bottom()則返回true。另一方面,空矩形(isNull() == true)的寬度和高度都設置為0。
還有一個比較常用的函數是轉置函數
QRect r = {15, 51, 42, 24};
r = r.transposed(); // r == {15, 51, 24, 42}
由于QRect和QRectF的定義方式,空QRect的定義方式基本上與QRectF相同。
4. 比較計算
這個也可以用 + 、- 、!= 等運算符。QRect對象可以流式化,也就是可以用QDataStream去序列化數據。
bool operator!=(const QRect &r1, const QRect &r2)
QRect operator+(const QRect &rectangle, const QMargins &margins)
QRect operator+(const QMargins &margins, const QRect &rectangle)
QRect operator-(const QRect &lhs, const QMargins &rhs)
QDataStream &operator<<(QDataStream &stream, const QRect &rectangle)
bool operator==(const QRect &r1, const QRect &r2)
QDataStream &operator>>(QDataStream &stream, QRect &rectangle)
三、渲染
當使用抗混疊繪制器時,QRect的邊界線將在數學矩形邊界線的兩側對稱地渲染。但是當使用別名繪制器(默認)時,其他規則適用。然后,當使用一個像素寬的筆渲染時,QRect的邊界線將渲染到數學矩形邊界線的右側和下方。
當使用兩個像素寬的筆渲染時,邊界線將被數學矩形從中間分割。當筆被設置為偶數像素時,就會出現這種情況,當使用帶有奇數像素的筆進行渲染時,多余的像素將被渲染到數學矩形的右側和下方,就像在一個像素的情況下一樣。
三、坐標
QRect類提供了一組函數,這些函數返回各種矩形坐標,并支持對這些坐標的操作。QRect還提供了相對于各種坐標移動矩形的函數。
例如,left(), setLeft()和movelleft()函數作為示例:left()返回矩形左邊緣的x坐標,setLeft()將矩形的左邊緣設置為給定的x坐標(它可以改變寬度,但永遠不會改變矩形的右邊緣),movelleft()將整個矩形水平移動,使矩形的左邊緣保持給定的x坐標,其大小不變。
請注意,由于歷史原因,bottom()和right()函數返回的值偏離了矩形的真正右下角:right()函數返回left() + width() - 1, bottom()函數返回top() + height() - 1。對于方便函數bottomRight()返回的點也是如此。此外,topRight()和bottomLeft()函數的x和y坐標分別包含與真正的右邊緣和底邊緣相同的偏差。
Qt建議我們使用x() + width()和y() + height()來找到真正的右下角,并避免使用right()和bottom()。
另一個解決方案是使用QRectF: QRectF類在平面中使用浮點精度的坐標定義一個矩形,QRectF::right()和QRectF::bottom()函數確實返回右坐標和底坐標。
還可以使用adjust()函數向這個矩形的坐標添加偏移量,也可以使用adjusted()函數基于對原始矩形的調整來檢索一個新的矩形。如果寬度和高度中的任何一個為負,則使用 normalized() 函數來檢索角被交換的矩形。
- normalized()
返回一個規范化矩形;也就是說,一個具有非負寬度和高度的矩形。
如果width() < 0,函數將交換左右角,如果height() < 0,函數將交換上下角。
此外,QRect還提供了getcoord()函數,該函數提取矩形的左上角和右下角的位置,以及getRect()函數,該函數提取矩形的左上角、寬度和高度。使用setcoord()和setRect()函數一次操作矩形的坐標和尺寸。