**QRectF
类详解及常用方法**
QRectF
是 PyQt5 中用于表示 浮点精度矩形区域 的类,继承自 QtCore
模块。它常用于图形绘制、布局计算、碰撞检测等场景,支持高精度的坐标计算。以下是其核心功能、常用方法及示例:
一、核心功能
- 坐标表示:用浮点数定义矩形的左上角坐标(
x, y
)、宽度(width
)和高度(height
)。 - 几何运算:计算交集、并集、移动位置、调整大小。
- 边界检测:判断点或矩形是否在区域内。
- 单位转换:与整数矩形
QRect
互相转换(注意精度丢失)。
二、构造函数
构造函数 | 说明 | 示例 |
---|
QRectF() | 创建空矩形((0,0,0,0) ) | rect = QRectF() |
QRectF(x: float, y: float, width: float, height: float) | 通过坐标和尺寸创建 | rect = QRectF(10.5, 20.3, 100.2, 50.7) |
QRectF(QPointF, QSizeF) | 通过左上角点 + 尺寸创建 | rect = QRectF(QPointF(10, 20), QSizeF(100, 50)) |
QRectF(QPointF_topLeft, QPointF_bottomRight) | 通过左上角和右下角点创建 | rect = QRectF(QPointF(10, 20), QPointF(110, 70)) |
三、常用方法
1. 属性获取
方法 | 说明 | 示例 |
---|
x() -> float | 左上角 X 坐标 | x = rect.x() |
y() -> float | 左上角 Y 坐标 | y = rect.y() |
width() -> float | 矩形宽度 | w = rect.width() |
height() -> float | 矩形高度 | h = rect.height() |
top() -> float | 上边界 Y 坐标(等价于 y() ) | top = rect.top() |
left() -> float | 左边界 X 坐标(等价于 x() ) | left = rect.left() |
bottom() -> float | 下边界 Y 坐标( + height() ) | bottom = rect.bottom() |
right() -> float | 右边界 X 坐标(x() + width() ) | right = rect.right() |
center() -> QPointF | 中心点坐标 | center = rect.center() |
2. 几何运算
方法 | 说明 | 示例 |
---|
contains(QPointF) -> bool | 判断点是否在矩形内 | rect.contains(QPointF(50, 50)) |
intersects(QRectF) -> bool | 判断两矩形是否相交 | rect1.intersects(rect2) |
intersected(QRectF) -> QRectF | 返回两矩形的交集 | overlap = rect1.intersected(rect2) |
united(QRectF) -> QRectF | 返回两矩形的并集 | merged = rect1.united(rect2) |
adjusted(dx1: float, dy1: float, dx2: float, dy2: float) -> QRectF | 调整矩形大小(左/上边移动 dx1, dy1 ,右/下边移动 dx2, dy2 ) | new_rect = rect.adjusted(5, 5, -5, -5) |
3. 修改属性
方法 | 说明 | 示例 |
---|
setX(x: float) | 设置左上角 X 坐标 | rect.setX(15.5) |
setY(y: float) | 设置左上角 Y 坐标 | rect.setY(25.5) |
setWidth(w: float) | 设置宽度 | rect.setWidth(200) |
setHeight(h: float) | 设置高度 | rect.setHeight(100) |
moveTo(x: float, y: float) | 移动矩形到新位置(保持尺寸) | rect.moveTo(30, 40) |
translate(dx: float, dy: float) | 平移矩形(相对当前位置) | rect.translate(10, -5) |
4. 类型转换
方法 | 说明 | 示例 |
---|
toRect() -> QRect | 转换为整数矩形 QRect (截断小数) | int_rect = rect.toRect() |
toAlignedRect() -> QRect | 转换为整数矩形(四舍五入) | int_rect = rect.toAlignedRect() |
四、代码示例
1. 基本操作
python
from PyQt5.QtCore import QRectF, QPointF
# 创建矩形
rect = QRectF(10.5, 20.5, 100.0, 50.0)
print(f"坐标: ({rect.x()}, {rect.y()}), 尺寸: {rect.width()}x{rect.height()}") # 输出: (10.5, 20.5), 100.0x50.0
# 判断点是否在矩形内
point =F(60.0, 45.0)
print(f"点是否在矩形内: {rect.contains(point)}") # 输出: True
# 计算交集
rect2 = QRectF(50.0, 30.0, 80.0, 60.0)
overlap = rect.intersected(rect2)
print(f"交集矩形: ({overlap.x()}, {overlap.y()}, {overlap.width()}, {overlap.height()})")
2. 图形绘制
python
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter
class Canvas(QWidget):
def paintEvent(self, event):
painter = QPainter(self)
rect = QRectF(50.5, 50.5, 200.2, 150.7)
painter.drawRect(rect) # 绘制矩形(自动转换为整数坐标)
app = QApplication([])
window = Canvas()
window.show()
app.exec_()
五、与 QRect
的区别
QRectF | QRect |
---|
使用 float 存储坐标和尺寸 | 使用 int 存储坐标和尺寸 |
适用于高精度计算(如图形变换) | 适用于像素级操作(如控件布局) |
六、注意事项
- 浮点精度问题:避免直接比较浮点数的相等性(如
rect.x() == 10.5
),应使用容差判断。 - 性能优化:频繁的矩形运算可能影响性能,建议在必要时缓存计算结果。
- 坐标系统:PyQt5 的默认坐标系以左上角为原点
(0,0)
,向右为 X 轴正方向,向下为 Y 轴正方向。
通过 QRectF
,可以轻松处理复杂的几何计算,适用于需要高精度的图形绘制和动态布局场景!