绘制矩形与 QRectF 类

01、简介

1、需要使用到的 QPainter 类中的函数

2、QRect 和 QRectF 类

QRect 是整型版本,QRectF 是精度更高的浮点型版本,本文以 QRectF 类进行讲解。

QRectF 类对矩形进行了描述,下面为该类中的函数

3、对于 QRect,由于历史原因,bottom()和 right()函数返回的值并不是真正的矩形的右下角,right()返回的值与 left()+width()-1 相同,bottom()返回的值与 top()+height()-1 相同,同理

bottomRight()、topRight()、bottomLeft()函数与 bottom()和 right()类似,详见下图。为避免这种情形,建议使用 QRectF 而不是 QRect。

4、QRectF 类的构造函数

从上面可以看出,QT是以左上角为坐标原点的 

02、QRectF类中的位置和大小函数

省略说明:

1、读取函数的返回类型与设置函数的形参类型是相同的,并且省略了读取函数小括号后的 const。

2、移动函数和设置函数都省略了返回类型 void,并且形数类型 QPointF 和 QSizeF 前的 const 也省略了。

函数说明:

1、形参 x 指的是 x 轴方向的 x 坐标位置,y 类似。

2、pos 是指的点的坐标位置。

3、height 和 width 是指的矩形的高度和宽高,注意,这不是坐标位置。QSizeF 也是指的宽度和高度。

4、比如 top()返回的是顶部的 y 轴坐标位置,setTop(11);表示设置矩形顶部的位置到 y 轴坐标位置 11 处,

底部保持不变,moveTop(11);表示垂直移动矩形,以使顶部位于 y 辆坐标位置 11 处。详见图示

其余位置和大小函数

1)、

void setRect(qreal x, qreal y, qreal width, qreal height);

设置矩形左上角坐标为(x,y),宽为 width,高为 height

2)、

void setCoords(qreal x1, qreal y1, qreal x2, qreal y2);

设置矩形左上角的坐标为(x1,y1),右下角坐标为(x2,y2);

3)、

void getRect(qreal *x, qreal *y, qreal *width, qreal *height) const;

把矩形的左上角坐标提取到(x,y)中,宽度提取到 width,高度提取到 height 中。

4)、

void getCoords(qreal *x1, qreal *y1, qreal *x2, qreal *y2) const;

把矩形的左上角坐标提取到(x1,y1)中,右下角坐标提取到(x2,y2)中。

03、判断矩形及点

1)、

bool contains(const QPointF &point) const;

若点 point 位于矩形内(含边缘),则返回 true。

bool contains(const QRectF &rectangle) const;

若矩形 rectangle 位于该矩形内,则返回 true。

bool contains(qreal x, qreal y) const; //若点(x,y)在矩形内(含边缘),则返回 true。

2)、

bool isEmpty() const; //矩形是否为空,详见下文。

若 宽度<=0 或 高度<=0,则 isEmpty()返回 true。

若 宽度=0 且 高度 = 0,则 isNull()返回 true。

空矩形意味着是无效的,即 isEmpty==!isValid();

注意:宽度或高宽 < 0 不代表该矩形不存在,若宽度或高度小于 0,矩形会向相反的方

向绘制。

示例:

QRectF r1(11,11, 0, 111);

3)、

QRectF normalized() const;

返回一个规范化矩形(即有效矩形),若 width() < 0,则交换左右角,若 height()<0,则

交换上下角。比如

QRectF r1(11,11, −111,111); QRectF r2 = r1.normalized(); //r2 =

04、平移矩形

1)、

void translate(qreal dx, qreal dy); void translate(const QPointF &offset);

把矩形沿 x 轴移动距离 dx,沿 y 轴移动距离 dy,负值向反方向移动。注意:移动的是

距离,而不是位置,其中 translate()会改变原矩形,而 translated()不会改变原矩形,但

会返回一个偏移后的副本。以上函数的原理与 QLineF 类中的相应函数是相同的,详见

QLineF 类。

2)、

QRectF transposed() const;

返回交换该矩形宽度和高度后的副本。比如

QRectF r1(11,33, 77,99);

05、调整矩形

1)、

void adjust(qreal dx1, qreal dy1, qreal dx2, qreal dy2)

把矩形的左上角坐标加上(dx1, dy1);右下角坐标加上(dx2, dy2); 其中 adjust()会改变原

矩形的坐标值,adjusted()不会改变原矩形的坐标值,但会返回一个新矩形,示例如下:

QRectF r1(QPointF(11,22), QPointF(111,122) );

2)、

QRectF marginsAdded(const QMarginsF &margins) const;

返回一个在现有矩形上增加或减小了边距 margins 的新矩形(即调整矩形的宽度和高度)

06、矩形的交集和并集

1)、

QRectF intersected(const QRectF &rectangle) const

返回该矩形与矩形 rectangle 的交集(即两矩形的重叠区域),注意:r1.intersected(r2)相当

于 r1&r2。

2)、

bool intersects(const QRectF &rectangle) const; //若该矩形与矩形 rectangle 相交,则返回 true。

3)、

QRectF united(const QRectF &rectangle) const; //返回该矩形与矩形 rectangle 的边界矩形。

07、浮点型与整形间的转化及其他

QRect toAlignedRect() const; //返回完全包含该矩形的最小 QRect(整数)矩形。

总结:
设置QRectF的四种方式中:

  1. 设置宽高只会影响右边以及下边边的位置;
  2. 设置坐标时右边以及下边位置不变,因此会影响宽高
  3. 设置边位置或者点位置时,对边或者对角点位置固定,因此也会影响宽高
  4. move系列的方法类似于鼠标拽住某个指定位置将item移动到指定位置,矩形的大小不变
  5. 设置时使用set,访问去掉set即可!

实例

在使用时直接指定边或者坐标的绝对量很容易出现错误,常常使用原位置+偏移位置的方式来设置坐标或者边、点的位置!

#include <QtWidgets>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QRectF curRect(0, 0, 100, 200);//QRectF(0,0 100x200)
    curRect.setX(20);//QRectF(20,0 80x200) 宽度!
    curRect.setWidth(300);//QRectF(20,0 300x200)
    curRect.setLeft(curRect.left() + 30);//QRectF(50,0 270x200) 右边不动,宽度变窄!
    curRect.setTopLeft(curRect.topLeft() + QPointF(20, 40));//QRectF(70,40 250x160) 右下点不动,宽高变窄!
    curRect.setRight(curRect.right() - 60);//QRectF(70,40 190x160)  左边不动,移动右边,宽度变窄!
    curRect.moveTop(curRect.top() + 33);//QRectF(70,73 190x160) 移动整体,整体尺寸不变!
    curRect.moveTopLeft(curRect.topLeft() + QPointF(55, 55));//QRectF(125,128 190x160) 根据左上移动整体,整体尺寸不变!
     
    return a.exec();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值