Qt | QRectF的使用以及应用场景

1 简介

官方文档QRectF

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

QRectF rect = this->rect();

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

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

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

  1. 直接设置坐标:
  2. rect.setX() rect.setY()//设置 rect.x() rect.y()//访问
  3. 直接设定xy坐标会直接改变坐标,Right和Bottom边的位置不变,因此会导致宽高发生变化。
  4. 直接设置宽高
  5. rect.setWidth() rect.setHeight()//设置 rect.width() rect.height()//访问
  6. 直接设定width height后,坐标不改变,宽高会改变。
  7. 设置某边或者点的坐标
    rect指定了一个矩形区域,此区域有四条边、四个点,可以直接操作边或者点来设置。
  8. rect.setLeft(qreal pos) rect.setTopLeft(QPointF)//设置 rect.left() rect.topLeft()//访问 Left\Right\Top\Bottom TopLeft\TopRight\BottomLeft\BottomRight
  9. 设置的边或者点的位置发生变化,但是对边或者对角点的位置不变。
  10. 两种方式直接确定矩形区域:
  11. rect.setRect(x, y, w, h) //设置矩形区域的局部坐标以及宽高 rect.setCoords(x1, y1, x2, y2) //设置左上点和右下点坐标
  12. 移动某边某点:
  13. rect.moveTop() rect.moveTopLeft()
  14. 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 场景

  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) 

文章转自博客园(YueLiGo):Qt | QRectF的使用以及应用场景

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值