1. QGraphicsScene基础概念解析
QGraphicsScene是Qt图形视图框架中的核心组件之一,它充当了一个虚拟的画布,用于管理和协调大量的2D图形项。这个设计模式在游戏开发、CAD软件和图像处理应用中非常常见。
1.1 场景坐标系系统
QGraphicsScene使用的是一个逻辑坐标系系统,默认情况下原点(0,0)位于场景中心,向右为X轴正方向,向下为Y轴正方向。这个坐标系与QGraphicsView的视口坐标系是分离的,两者通过变换矩阵进行映射。
场景坐标系有几个重要特点:
- 坐标值可以是任意浮点数,不受物理像素限制
- 支持无限扩展的场景空间(理论上)
- 可以设置场景矩形边界(sceneRect)来限定有效区域
cpp复制// 创建一个500x500的场景
QGraphicsScene *scene = new QGraphicsScene();
scene->setSceneRect(0, 0, 500, 500);
1.2 场景与视图的关系
QGraphicsScene本身并不负责显示内容,它需要与一个或多个QGraphicsView配合使用。这种设计实现了模型-视图分离,带来了几个关键优势:
- 同一场景可以在多个视图中同时显示
- 每个视图可以有不同的变换(缩放、旋转)
- 视图可以显示场景的不同区域
- 场景变化会自动同步到所有关联视图
cpp复制QGraphicsView *view1 = new QGraphicsView(scene);
QGraphicsView *view2 = new QGraphicsView(scene);
// 现在两个视图显示同一个场景
1.3 图形项管理机制
场景中的每个图形元素都是QGraphicsItem的子类对象。场景负责:
- 维护图形项的父子关系
- 处理图形项的Z值排序
- 管理图形项的选取状态
- 调度图形项的绘制顺序
- 处理图形项之间的事件传递
提示:虽然QGraphicsScene可以管理大量图形项,但当项数超过数千时,性能会明显下降。这时需要考虑使用空间索引优化。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 场景创建与基本配置
2.1 初始化场景的三种方式
在实际开发中,我们通常有三种创建场景的方式:
- 空场景构造:
cpp复制QGraphicsScene *scene = new QGraphicsScene(parent);
- 指定场景矩形:
cpp复制QGraphicsScene *scene = new QGraphicsScene(0, 0, 800, 600, parent);
// 等价于:
QGraphicsScene *scene = new QGraphicsScene();
scene->setSceneRect(0, 0, 800, 600);
- 从现有图形项构建:
cpp复制QGraphicsRectItem *rect = new QGraphicsRectItem(0, 0, 100, 100);
QGraphicsScene *scene = new QGraphicsScene();
scene->addItem(rect);
2.2 场景背景与前景设置
场景支持设置三种可视化层:
- 背景层:最底层,通常用于网格或背景图
- 图形项层:中间层,放置所有图形项
- 前景层:最上层,可用于覆盖装饰或UI元素
cpp复制// 设置纯色背景
scene->setBackgroundBrush(Qt::lightGray);
// 设置渐变背景
QLinearGradient gradient(0, 0, 0, 400);
gradient.setColorAt(0, Qt::white);
gradient.setColorAt(1, Qt::darkGreen);
scene->setBackgroundBrush(gradient);
// 设置前景(半透明红色)
scene->setForegroundBrush(QColor(255, 0, 0, 50));
