QT几何类
1. 核心几何类概览
| 类名 | 描述 | 坐标类型 | 常用成员 |
|---|---|---|---|
QPoint |
二维平面上的整数点 | int |
x(), y(), rx(), ry()x(), y(), rx(), ry() |
QPointF |
二维平面上的浮点数点 | qreal (double) |
x(), y(), rx(), ry() |
QSize |
整数尺寸(宽和高) | int |
width(), height() |
QSizeF |
浮点数尺寸(宽和高) | qreal |
width(), height() |
QRect |
整数矩形(位置+尺寸) | int |
topLeft(), size(), center() |
QRectF |
浮点数矩形(位置+尺寸) | qreal |
topLeft(), size(), center() |
2. QPoint / QPointF 关键操作
- 构造与访问
QPoint p1(10, 20); // 整数点 (10, 20)
QPointF p2(15.5, 25.3); // 浮点 (15.5, 25.3)
int x = p1.x(); // 10
qreal y = p2.y(); // 25.3
- 坐标修改
p1.setX(30); // (30, 20)
p2.ry() += 5.0; // (15.5, 30.3) - ry()返回引用
- 算术运算
QPoint p3 = p1 + QPoint(5, 5); // (35, 25)
QPoint p4 = p1 * 2; // (60, 40) 缩放
QPointF p5 = p2 / 2.0; // (7.75, 15.15)
- 实用函数
double dot = QPointF::dotProduct(p2, p5); // 点积
QPoint transposed = p1.transposed(); // (20, 10) 交换x/y
int length = p1.manhattanLength(); // 计算曼哈顿长度
- 运算符重载
QPoint类重载了多个运算符,使得该类可以像基本数据类型一样进行运算
QPoint operator+(const QPoint &point) // 两个点相加,返回一个新的QPoint对象。
QPoint operator-(const QPoint &point) // 两个点相减,返回一个新的QPoint对象。
QPoint operator*(int factor) // 将点乘以一个整数因子,返回一个新的QPoint对象。
QPoint operator/(qreal divisor) // 将点除以一个实数因子,返回一个新的QPoint对象。
bool operator==(const QPoint &other) // 判断两个点是否相等。
bool operator!=(const QPoint &other) // 判断两个点是否不相等。
3. QSize / QSizeF 关键操作
- 构造与访问
QSize s1(100, 50); // 宽100, 高50
QSizeF s2(150.5, 75.3);
int w = s1.width(); // 100
qreal h = s2.height(); // 75.3
- 尺寸修改
s1.setWidth(120); // (120, 50)
s2.scale(200, 100, Qt::KeepAspectRatio); // 按比例缩放到目标尺寸
- 特殊值
s1.expandedTo(QSize(150, 60)); // 取最大宽高:(150, 60)
s2.boundedTo(QSizeF(100, 100)); // 取最小宽高:(100, 75.3)
- 有效性判断
bool valid = !s1.isEmpty(); // 宽高>0
bool null = s2.isNull(); // 宽高==0
4. QRect / QRectF 关键操作
- 构造方式
// 方式1: 左上角坐标 + 尺寸
QRect rect1(QPoint(10, 20), QSize(100, 50));
// 方式2: x, y, width, height
QRectF rect2(15.5, 25.3, 150.5, 75.3);
- 关键属性访问
QPoint topLeft = rect1.topLeft(); // (10, 20) 获取左上角点
QSize size = rect1.size(); // (100, 50) 获取尺寸(长宽)
QPoint center = rect1.center(); // (60, 45) 获取中心位置
int right = rect1.right(); // 109 (x+width-1) // 获取右边界x
int bottom = rect1.bottom(); // 69 (y+height-1) // 获取下边界y
- 几何操作
// 移动位置
rect1.moveTopLeft(QPoint(30, 40)); // 左上角移动到(30,40)
// 调整大小
rect1.setSize(QSize(120, 60)); // 尺寸变为120x60
// 相对调整
rect1.adjust(10, 5, -10, -5); // 左+10, 上+5, 右-10, 下-5
- 矩形关系判断
// 包含检测
bool containsPoint = rect1.contains(QPoint(50, 50)); // 点是否在矩形内
bool containsRect = rect1.contains(QRect(40, 30, 20, 20)); // 矩形是否在矩形内
// 相交检测
QRect intersected = rect1.intersected(otherRect); // 获取相交矩形
bool intersects = rect1.intersects(otherRect); // 判断是否相交
// 合并
QRect united = rect1.united(otherRect);
5. 类型转换与互操作性
- 整型与浮点转换
QPointF pf = p1.toPointF(); // 整型转浮点
QPoint pi = p2.toPoint(); // 浮点转整型(截断)
QRectF rf = rect1.toRectF(); // QRect → QRectF
QRect ri = rect2.toRect(); // QRectF → QRect(截断坐标)
- 类间组合
// 从点和尺寸构造矩形
QRect rect3(QPoint(10, 10), QSize(100, 100));
// 从矩形获取组件
QPoint topLeft = rect3.topLeft();
QSize size = rect3.size();
6. 重要注意事项
-
坐标系系统:
- Qt 使用数学坐标系(Y轴向下)
- 原点 (0,0) 在左上角
-
QRect 的特殊性:
QRect r(10, 10, 5, 5); // 实际包含的像素:x=10-14, y=10-14 // width=5 表示从10到14(共5个像素) -
浮点类优势:
- 避免整数截断误差
- 适合图形变换(缩放、旋转)
- 更精确的碰撞检测
-
空值表示:
QPoint(0,0)是有效点- 使用
isNull()判断零值:QSize().isNull(); // true QRect().isNull(); // true

浙公网安备 33010602011771号