您的位置:首页 > 新闻 > 资讯 > Qt扫盲-QRect矩形描述类

Qt扫盲-QRect矩形描述类

2024/10/5 14:42:51 来源:https://blog.csdn.net/qq_43680827/article/details/140123943  浏览:    关键词:Qt扫盲-QRect矩形描述类

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com