zl程序教程

您现在的位置是:首页 >  工具

当前栏目

QT中矩形操作中QMarginsF[QMargins]的使用与QRectF的adjusted的对比

Qt 操作 对比 矩形 使用
2023-09-27 14:27:33 时间

QT绘图中,我们可以说几乎无法逃过QRect的使用,尤其是类似与自定义控件的编写,GraphicsItems的编写,都离不开这个矩形。可以说,有了矩形你才有了几乎一些绘图的基础。队矩形的修改是非常的频繁,这里我们常用的修改矩形大小的方法有两种:

一、adjusted与adjust

1、adjusted

这个方法,需要四个参数,而且四个参数所表达的意思一不小心会弄错

QRectF::adjusted(qreal xp1, qreal yp1, qreal xp2, qreal yp2)

如果我们要得到一个向内缩小的矩形,则需要前两个值为正,后两个值为负。
前两个参数是起点,即矩形的左下角点,如果使用正数值调整起点,则得到的矩形会在原来的基础上朝右上角移动;
后两个参数是终点,即矩形的右上角点,如果使用负数值调整终点,则得到的矩形的右上角点向左下方向移动;
假使,我们有一个矩形内缩10,则我们的代码这样写才可以:

int pad=10;
QRectF rectf(0,0,100,40);
rectf.adjusted(pad, pad, -pad, -pad)

进行外扩或者内缩的修改大时一定要搞清楚正负,否则就不那么方便了。
当然,如果是普通的调整矩形的范围,即修改起点(左下角点)和终点(右上角点),那么矩形的覆盖范围就变了,也就基本和原来的矩形没有什么关系了。

2、adjust

这个方法用起来貌似和上面的adjusted没有什么差别,说句笑话:他们一个是“”一般式”一个是“过去式”!
实际上一个矩形使用过adjust后,这个矩形本身就会被修改,而adjusted是不会修改矩形本身,而是这个方法返回了一个经adjusted修改后的矩形副本。看看代码:

QRect rect1(20, 20, 20, 20);
rect1.adjust(1, 2, 3, 4);   
 //adjust修改过后rect1的四个值变成了21, 22, 23, 24

QRect rect2;
rect2 = rect1.adjusted(1, 2, 3, 4);    
//adjusted之后rect1没有任何变化(“你大爷还是你大爷,你大娘已经不是当年的大娘了”)
//rect2的四个值变成了22, 24, 26, 28

二、QMarginsF

1、marginsAdded典型用法

这个方法,可以说是专门用来进行内缩和外扩修改的专用方法,用好了可以提高程序的一次性成功度,不需要像adjusted那样反复调整。当然,它需要设计到一个专用的类-边距类:QMarginsF,QRect.marginAdded() 可以让我们通过边距类来调整矩形的大小。相当于是给矩形增加一个属性margin。
我们来看看代码,看看margin是如何操作的:

int offset=10;
QRectF rectf(0,0,100,40);
QMarginsF margin(offset,offset,offset,offset);
painter->drawRoundedRect(rectf.marginsAdded(margin),10,10);

当然,我们也可以直接利用QMarginsF来初始化

QRectF rectf(0,0,100,40);
QMarginsF margin(offset,offset,offset,offset);
painter->drawRoundedRect(rectf.marginsAdded(QMargins(10,10,10,10)),10,10);

2、分别获取或者修改四个边距

QMarginsF的操作还更有意思,可以分别对四个边距进行修改:

int offset=10;
QRectF rectf(0,0,100,40);
QMarginsF margin(offset,offset,offset,offset);
qDebug()<<margin.bottom()<<margin.left()<<margin.right()<<margin.top(); //获取该对象的四个属性值
qDebug()<<margin.isNull();  //当上下左右四个值全部为0的时候,返回true
margin.setLeft(12); //设置外边距对象的左边距
margin.setTop(20); //设置外边距对象的上边距
margin.setRight(16); //设置外边距对象的右边距
margin.setBottom(24); //设置外边距对象的下边距

3、判断是否存在边距isNull

QMarginsF定义了一组四个边距;左、上、右、下,它们描述了一个矩形周围边框的有限尺寸。
仅当所有边距都非常接近零时,isNull()函数才返回 true 。

int offset=10;
QRectF rectf(0,0,100,40);
QMarginsF margin(offset,offset,offset,offset);
qDebug()<<margin.bottom()<<margin.left()<<margin.right()<<margin.top(); //获取该对象的四个属性值
qDebug()<<margin.isNull();  //当上下左右四个值全部为0的时候,返回true

4、可以进行加减操作

这个有趣啦,那是adjusted做梦也不可能追上的功能,我们来看看代码先:

QRectF rectf(0,0,100,40);
QMarginsF margin(offset,offset,offset,offset);
margin=margin+10;
painter->drawRoundedRect(rectf.marginsAdded(margin),10,10);

执行margin=margin+10后,相当于给每个边距都增加了10;

5、marginsRemoved

前面我们讲到的marginsAdded可以外扩一个矩形,我们如果想内缩,就 可以用这个方法marginsRemoved,如:

 int offset=4;
 QMarginsF margin(offset,offset,offset,offset);
 QRectF rectf(0,0,100,40);
 QRectF mrect=rectf.marginsAdded(margin);
 painter->drawRect(mrect.marginsRemoved(margin));

如果按照上面的代码,最终画出来的矩形大小还是rectf的原始大小。

最后提一句,QMarginsF与QMargins的差别,计算精度上的差别,不用太纠结,直接用QMarginsF更好。