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 类的构造函数
从上面可以看出,QT是以左上角为坐标原点的
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; //矩形是否为空,详见下文。
若 宽度<=0 或 高度<=0,则 isEmpty()返回 true。
若 宽度=0 且 高度 = 0,则 isNull()返回 true。
空矩形意味着是无效的,即 isEmpty==!isValid();
注意:宽度或高宽 < 0 不代表该矩形不存在,若宽度或高度小于 0,矩形会向相反的方
向绘制。
示例:
QRectF r1(11,11, 0, 111);
3)、
QRectF normalized() const;
返回一个规范化矩形(即有效矩形),若 width() < 0,则交换左右角,若 height()<0,则
交换上下角。比如
QRectF r1(11,11, −111,111); QRectF r2 = r1.normalized(); //r2 =
04、平移矩形
1)、
void translate(qreal dx, qreal dy); void translate(const QPointF &offset);
把矩形沿 x 轴移动距离 dx,沿 y 轴移动距离 dy,负值向反方向移动。注意:移动的是
距离,而不是位置,其中 translate()会改变原矩形,而 translated()不会改变原矩形,但
会返回一个偏移后的副本。以上函数的原理与 QLineF 类中的相应函数是相同的,详见
QLineF 类。
2)、
QRectF transposed() const;
返回交换该矩形宽度和高度后的副本。比如
QRectF r1(11,33, 77,99);
05、调整矩形
1)、
void adjust(qreal dx1, qreal dy1, qreal dx2, qreal dy2)
把矩形的左上角坐标加上(dx1, dy1);右下角坐标加上(dx2, dy2); 其中 adjust()会改变原
矩形的坐标值,adjusted()不会改变原矩形的坐标值,但会返回一个新矩形,示例如下:
QRectF r1(QPointF(11,22), QPointF(111,122) );
2)、
QRectF marginsAdded(const QMarginsF &margins) const;
返回一个在现有矩形上增加或减小了边距 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(整数)矩形。
总结:
设置QRectF的四种方式中:
- 设置宽高只会影响右边以及下边边的位置;
- 设置坐标时右边以及下边位置不变,因此会影响宽高
- 设置边位置或者点位置时,对边或者对角点位置固定,因此也会影响宽高
move
系列的方法类似于鼠标拽住某个指定位置将item移动到指定位置,矩形的大小不变- 设置时使用set,访问去掉set即可!
实例
在使用时直接指定边或者坐标的绝对量很容易出现错误,常常使用原位置+偏移位置
的方式来设置坐标或者边、点的位置!
#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();
}