Qt中QRect和CRect的比较
本文介绍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()
函数。
参考文档: