Qt | 绘制矩形与 QRectF 类

15 阅读6分钟

点击上方"蓝字"关注我们

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 类的构造函数

1)、QRectF()QRectF(const QPointF &topLeft, const QSizeF &size); //由左上角的点 topLeft 和大小构造矩形QRectF(const QPointF &topLeft, const QPointF &bottomRight); //由左上角和右下角的点构造矩形QRectF(qreal x, qreal y, qreal width, qreal height)QRectF(const QRect &rectangle)

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; //矩形是否为空,详见下文。bool isNull() const; //矩形是否不存在,详见下文。bool isValid() const; //矩形是否无效,详见下文。

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

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

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

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

向绘制。

示例:

QRectF r1(11,11, 0, 111);//r1.isEmpty() = true; r1.isNull() = false; r1.isValid() = false。QRectF r2(11,11, 0, 0);//r2.isEmpty() = true; r2.isNull() = true; r2.isValid() = false。QRectF r3(11,11, −111, −111); //r3.isEmpty() = true; r3.isNull() = false; r3.isValid() = false。QRectF r4(11,11, 111, 111); //r4.isEmpty() = false; r4.isNull() = false; r4.isValid() = true

3)、

QRectF normalized() const;

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

交换上下角。比如

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

04、平移矩形

1)、

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

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

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

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

QLineF 类。

2)、

QRectF transposed() const;

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

QRectF r1(11,33, 77,99);QRectF r2=r1.transposed(); //r1 不变,r2 是 r1 交换高宽后的结果,即 r2=(11,33,99,77);​

05、调整矩形

1)、

void adjust(qreal dx1, qreal dy1, qreal dx2, qreal dy2)QRectF adjusted(qreal dx1, qreal dy1, qreal dx2, qreal dy2) const

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

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

QRectF r1(QPointF(11,22), QPointF(111,122) );r1.adjust(33,33,155,155) ; //r1 左上角坐标为(44,55),右上角坐标为(266,277);QRectF r2=r1.adjusted(33,33,155,155) ; //r1 不变,r2 左上角坐标为(44,55),右上角坐标为(266,277);

2)、

QRectF marginsAdded(const QMarginsF &margins) const;//qt5.3QRectF marginsRemoved(const QMarginsF &margins) const;//qt5.3

返回一个在现有矩形上增加或减小了边距 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(整数)矩形。QRect toRect() const; //根据该矩形返回一个 QReect(整数)矩形,其值将被四舍五入到最接近的整数。CGRect toCGRect() const; //从 QRectF 创建 CGRect, qt5.8static QRectF fromCGRect(CGRect rect); //从 rect 创建一个 QRectF, 静态的,qt5.8

08、重载的操作符函数

QRectF operator&(const QRectF &rectangle) const; //返回两矩形的交集。QRectF &operator&=(const QRectF &rectangle);QRectF &operator+=(const QMarginsF &margins); //返回增加边距后的矩形QRectF &operator-=(const QMarginsF &margins); //返回缩小边距后的矩形。QRectF operator|(const QRectF &rectangle) const; //返回边界矩形(并集)。QRectF &operator|=(const QRectF &rectangle)

总结

学而时习之,不亦说乎

故我在

点击下方卡片 关注我

↓↓↓

Qt历险记

一名技术分享师,分享方向:->Qt(C/C++、linux、STM32、MySql/Sqlite3、TCP/UDP),设计方面->Ai、PS、visio、AD、Protues。 【v合作:Family_S_Health】

**

公众号

好看,请点击

收藏

点赞

在看

+1