1 简介
QRectF中保存(x, y, width, height),常常用于记录图形项在局部坐标系中的位置以及图形项的宽高:
QRectF rect = this->rect();
2 位置与宽高的设定与访问
官方文档提供了几种设置与访问上述参数的方法,直接设置坐标、直接设置宽高、设置边点的位置、设置整体的位置、移动某边或者某点。
其中设定坐标、设定边点位置等都会影响矩形区域的宽高。
-
直接设置坐标:
rect.setX() rect.setY()//设置 rect.x() rect.y()//访问
直接设定
xy
坐标会直接改变坐标,Right和Bottom边的位置不变,因此会导致宽高发生变化。 -
直接设置宽高
rect.setWidth() rect.setHeight()//设置 rect.width() rect.height()//访问
直接设定
width
height
后,坐标不改变,宽高会改变。 -
设置某边或者点的坐标
rect指定了一个矩形区域,此区域有四条边、四个点,可以直接操作边或者点来设置。rect.setLeft(qreal pos) rect.setTopLeft(QPointF)//设置 rect.left() rect.topLeft()//访问 Left\Right\Top\Bottom TopLeft\TopRight\BottomLeft\BottomRight
设置的边或者点的位置发生变化,但是对边或者对角点的位置不变。
-
两种方式直接确定矩形区域:
rect.setRect(x, y, w, h) //设置矩形区域的局部坐标以及宽高 rect.setCoords(x1, y1, x2, y2) //设置左上点和右下点坐标
-
移动某边某点:
rect.moveTop() rect.moveTopLeft()
move
系列的方法类似于鼠标拽住某个指定位置将item移动到指定位置,矩形的大小不变!
总结:
设置QRectF的四种方式中:
- 设置宽高只会影响右边以及下边边的位置;
- 设置坐标时右边以及下边位置不变,因此会影响宽高
- 设置边位置或者点位置时,对边或者对角点位置固定,因此也会影响宽高
move
系列的方法类似于鼠标拽住某个指定位置将item移动到指定位置,矩形的大小不变- 设置时使用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 场景
-
在QGraphicsItem体系中,常常需要拉伸item,可以通过计算某边移动的偏移量,基于rect原位置来设置rect对应的边即可。
-
子部件受到父部件的约束,子部件大小不能超过父部件,位置不能超出父部件,因此使用rect判断以及判断后的移动很方便!