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. 重要注意事项

  1. 坐标系系统

    • Qt 使用数学坐标系(Y轴向下)
    • 原点 (0,0) 在左上角
  2. QRect 的特殊性

    QRect r(10, 10, 5, 5); 
    // 实际包含的像素:x=10-14, y=10-14
    // width=5 表示从10到14(共5个像素)
    
  3. 浮点类优势

    • 避免整数截断误差
    • 适合图形变换(缩放、旋转)
    • 更精确的碰撞检测
  4. 空值表示

    • QPoint(0,0) 是有效点
    • 使用 isNull() 判断零值:
      QSize().isNull();   // true
      QRect().isNull();   // true
      
posted @ 2025-09-02 18:01  一楼二栋  阅读(27)  评论(0)    收藏  举报