本文介紹Qt
的QRect
和Windows
下的CRect
的比較。
構造方法
QRect
的無參構造方法是這樣的:
QRect(): x1(0),y1(0),x2(-1),y2(-1)
默認構造的x2和y2為-1,而CRect
的無參構造這兩個數值為0。
帶4個整形參數未知的構造方法是這樣的:
QRect(int aleft, int atop, int awidth, int aheight)
{
x1 = aleft;
y1 = atop;
x2 = aleft + awidth - 1;
y2 = atop + aheight - 1;
}
CRect的四個整形參數構造方法是這樣的:
CRect::CRect(int l, int t, int r, int b)
{
left = l;
top = t;
right = r;
bottom = b;
}
注意第三個參數是寬度,第四個是高度,而CRect
的4個整形參數,后兩個是right
和bottom
,內在
寬高屬性
因為QRect
在設置寬度時,x2的坐標有-1操作,要獲得構造時的寬度,就通過 x2 - x1 + 1
,這樣的方法來獲得,這也是 QRect::width()
的內部實現。
CRect
的寬度width
直接等於 right - left
。在CRect中,經常是這樣設置寬度的,
const int nWidth = 15;
CRect rt;
rt.left = 10;
rt.right = rt.left + nWidth;
這樣設置目標寬度和設置是要一致的。如果上述做法遷移到QRect
上,就會有偏大。
const int nWidth = 15;
QRect rt;
rt.setLeft(10);
rt.setRight(rt.left() + nWidth);
這樣設置,rt的寬度實際上是16,而不是期望的15.如果需要正確的設置,則需要這樣:
const int nWidth = 15;
QRect rt;
rt.setLeft(10);
rt.setWidth(nWidth);
調用setWidth
來設置寬度,可使得結果與預期一致。QRect
的高度設置也是一樣,建議用setHeight
來設置高度.
另一點注意,QRect::setWidth
和 QRect::setHeight
是通過更改x2
、y2
來改變寬高,左上角坐標是不會改變的。以下的做法是不能達到目的的:
// 先設置右邊距,再設置寬度,這樣不會使得left邊界位於10這里
QRect rt;
rt.setRight(20);
rt.setWidth(10);
QRect的其他函數說明
moveLeft
是移動整個矩形,使之位於指定左邊距。
setLeft
是移動左邊距,不會改變右邊距。
獲得右邊距:建議使用 x() + width(),而不是 right()。right()會比實際位置少1個單位。
獲得下邊距:建議使用 y() + height(),而不是 bottom()。
小結
QRect
類建議只使用left(),top(),width()和height()
這些成員函數,不要用right()
和bottom()
函數。
參考文檔: