Qt中QRect和CRect的比較


本文介紹QtQRectWindows下的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個整形參數,后兩個是rightbottom,內在

寬高屬性

因為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::setWidthQRect::setHeight是通過更改x2y2來改變寬高,左上角坐標是不會改變的。以下的做法是不能達到目的的:


// 先設置右邊距,再設置寬度,這樣不會使得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()函數。

參考文檔:

Qt 學習之路 :坐標系統


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM