Qt的Graphics View框架是一个用于处理和展示大量2D图形项的强大工具。它被设计用来替代之前的QCanvas类,提供了更高级的功能和更好的性能优化。QGraphicsView、QGraphicsScene 和 QGraphicsItem 类这三个类共同构成了 Graphics View 框架。
核心概念
-
场景(Scene):
- 使用
QGraphicsScene表示一个管理大量图元(items)的容器。 - 场景是图元的容器,负责管理所有添加到其中的图元的位置、选择状态、碰撞检测等。
- 使用
-
视图(View):
- 通过
QGraphicsView来显示场景中的内容。 - 视图是用户与场景交互的窗口,可以有多个视图显示同一个场景,并且支持缩放、旋转等变换。
- 通过
-
图元(Items):
- 图元由
QGraphicsItem及其子类表示,如QGraphicsRectItem,QGraphicsEllipseItem,QGraphicsPixmapItem等。 - 每个图元都是独立的对象,可以有自己的几何形状、位置、变换属性以及事件响应机制。
- 图元由
主要功能
- 高效的渲染引擎:Graphics View使用BSP(Binary Space Partitioning)树来快速确定哪些图元需要重新绘制,从而提高渲染效率。
- 支持分组:可以通过将一个图元设置为另一个图元的父级来创建图元组,这样可以一起移动或变换一组图元。
- 事件传播:提供了一套完整的事件模型,允许图元接收键盘、鼠标和其他输入设备的事件。
- 拖拽支持:内置了对拖拽操作的支持,方便实现图元间的拖拽行为。
- 碰撞检测:支持基于形状的精确碰撞检测,可用于游戏开发或其他需要物理交互的应用中。
使用步骤
- 创建场景:实例化一个
QGraphicsScene对象,并调用其setSceneRect()方法设置场景边界。 - 添加图元:创建各种类型的
QGraphicsItem子类对象,并调用场景的addItem()方法将它们添加到场景中。 - 创建视图:实例化一个或多个
QGraphicsView对象,调用其setScene()方法关联到相应的场景。 - 配置视图:根据需要调整视图的属性,如缩放比例、背景色等。
QGraphicsView
QGraphicsView 是可视化组件,用于显示 QGraphicsScene 的内容。
主要功能:
-
提供可视化窗口,用户可以查看场景
-
支持缩放和旋转
-
处理视图转换
-
提供滚动条
-
可以作为视口嵌入到其他小部件中
常用方法:
// 设置场景
void setScene(QGraphicsScene* scene);
// 视图变换
void scale(qreal sx, qreal sy); // 缩放
void rotate(qreal angle); // 旋转
void translate(qreal dx, qreal dy); // 平移
// 获取/设置视图参数
QGraphicsScene* scene() const;
void setRenderHint(QPainter::RenderHint hint, bool enabled = true);
void setViewportUpdateMode(ViewportUpdateMode mode);
QGraphicsScene
QGraphicsScene 是图形项的容器,管理所有 QGraphicsItem 对象。
主要功能:
-
管理大量图形项
-
传播事件给图形项
-
提供未变换的渲染功能
-
管理图形项状态(选择、焦点等)
-
提供高效的碰撞检测
常用方法:
// 添加/移除项
QGraphicsItem* addItem(QGraphicsItem* item);
void removeItem(QGraphicsItem* item);
// 查找项
QList<QGraphicsItem*> items() const;
QList<QGraphicsItem*> items(const QPointF& pos) const;
// 场景属性
QRectF sceneRect() const;
void setSceneRect(const QRectF& rect);
// 事件处理
void mousePressEvent(QGraphicsSceneMouseEvent* event);
void keyPressEvent(QKeyEvent* event);
QGraphicsItem
QGraphicsItem 是场景中图形项的基类,可以被添加到 QGraphicsScene 中。
主要功能:
-
提供图形项的几何形状
-
处理鼠标和键盘事件
-
支持分组(通过 QGraphicsItemGroup)
-
支持拖放
-
支持碰撞检测
常用方法:
// 几何属性
QRectF boundingRect() const; // 必须重写
QPainterPath shape() const; // 可选重写
// 外观
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = nullptr); // 必须重写
// 位置和变换
void setPos(const QPointF& pos);
void setRotation(qreal angle);
void setScale(qreal factor);
// 状态
void setSelected(bool selected);
void setFocus();
三者关系
-
QGraphicsView 是观察者,可以有多个视图观察同一个场景
-
QGraphicsScene 是场景,管理所有图形项
-
QGrap


1万+

被折叠的 条评论
为什么被折叠?



