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()函数一次操作矩形的坐标和尺寸。