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 学习之路 :坐标系统

posted @ 2021-12-22 19:21  浩天之家  阅读(1102)  评论(0编辑  收藏  举报