1 简介

QRectF中保存(x, y, width, height),常常用于记录图形项在局部坐标系中的位置以及图形项的宽高:

QRectF rect = this->rect();

2 位置与宽高的设定与访问

官方文档提供了几种设置与访问上述参数的方法,直接设置坐标、直接设置宽高、设置边点的位置、设置整体的位置、移动某边或者某点。
其中设定坐标、设定边点位置等都会影响矩形区域的宽高。

  1. 直接设置坐标:
rect.setX()
rect.setY()//设置

rect.x()
rect.y()//访问

直接设定xy坐标会直接改变坐标,Right和Bottom边的位置不变,因此会导致宽高发生变化。

  1. 直接设置宽高
rect.setWidth()
rect.setHeight()//设置

rect.width()
rect.height()//访问

直接设定width height后,坐标不改变,宽高会改变。

  1. 设置某边或者点的坐标
    rect指定了一个矩形区域,此区域有四条边、四个点,可以直接操作边或者点来设置。
rect.setLeft(qreal pos)
rect.setTopLeft(QPointF)//设置

rect.left()
rect.topLeft()//访问

Left\Right\Top\Bottom
TopLeft\TopRight\BottomLeft\BottomRight

设置的边或者点的位置发生变化,但是对边或者对角点的位置不变。

  1. 两种方式直接确定矩形区域:
rect.setRect(x, y, w, h) //设置矩形区域的局部坐标以及宽高
rect.setCoords(x1, y1, x2, y2) //设置左上点和右下点坐标
  1. 移动某边某点:
rect.moveTop()
rect.moveTopLeft()

move系列的方法类似于鼠标拽住某个指定位置将item移动到指定位置,矩形的大小不变!

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

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

3 使用(原位置+偏移)

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

#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();
}

4 场景

  1. 在QGraphicsItem体系中,常常需要拉伸item,可以通过计算某边移动的偏移量,基于rect原位置来设置rect对应的边即可。
  2. 子部件受到父部件的约束,子部件大小不能超过父部件,位置不能超出父部件,因此使用rect判断以及判断后的移动很方便!

5 其他常用的函数

  • bool r.intersects(r1)是否与其他相交,若要返回相交区域则使用intersected
  • QRectF r.united(r1)返回与其他矩形的并集所在的大矩形
  • bool r.contains(r1或者p1)是否包含其他矩形或者点
  • QRectF r.normalize()将宽和高变为正数,实际上只是将坐标从右下角移动到了左上角,从而宽高都变为正数
  • QGraphicsItem.moveBy(qreal dx, qreal dy)此函数是图形项的函数,用于图形项的移动,其相当于setPos(pos()+QPointF(dx, dy)),记录到此
QRectF curRect1(0, 0, 200 ,300);
QRectF curRect2(100, 100, 300, 300);
qDebug() << curRect1.intersects(curRect2);//true
qDebug() << curRect1.intersected(curRect2);//QRectF(100,100 100x200)
qDebug() << curRect1.united(curRect2);//QRectF(0,0 400x400)

QRectF curRect5(0, 0, 400, 400);
QRectF curRect6(10, 10, 200, 200);
qDebug() << curRect5.contains(curRect2);//true

QRectF curRect3(0, 0, -100, -200);
qDebug() << curRect3.normalized();//QRectF(-100,-200 100x200)