在 Qt C++ 中,高级绘图功能主要由Qt Graphics View Framework(图形视图框架)和Qt Paint System(绘图系统)共同支撑。它们提供了从底层像素绘制到高层场景管理的一整套机制。
下面分别介绍这两个体系中的核心类及其关系:
一、Qt Paint System(基础绘图系统)
用于直接在窗口、控件或图像上进行 2D 绘图。
核心类
| 类名 | 作用 |
|---|---|
QPainter | 执行实际绘图操作的类,提供 drawLine、drawRect、drawText 等方法 |
QPaintDevice | 抽象基类,表示可以被 QPainter 绘制的目标设备 |
QWidget | 继承自 QPaintDevice,是最常用的绘图目标(重写 paintEvent) |
QPixmap/QImage/QPicture | 都继承自 QPaintDevice,分别用于屏幕优化位图、可直接访问像素的图像、可记录/回放的绘图指令 |
类关系简图
QPaintDevice ↑ ├── QWidget ├── QPixmap ├── QImage └── QPicture QPainter ——(uses)——→ QPaintDevice注意:
QPainter必须在QPaintDevice的paintEvent()(对 QWidget)或显式 begin/end 范围内使用。
二、Qt Graphics View Framework(高级图形视图框架)
适用于需要管理大量 2D 图形项、支持缩放/平移/交互的复杂场景(如流程图、CAD、游戏地图等)。
三大核心组件(MVC 架构思想)
| 组件 | 类 | 作用 |
|---|---|---|
| Model(数据) | QGraphicsScene | 存储和管理所有图形项(QGraphicsItem及其子类) |
| View(视图) | QGraphicsView | 提供可视化窗口,支持滚动、缩放、拖拽等交互 |
| Item(元素) | QGraphicsItem | 场景中的基本图形单元(如矩形、文本、自定义图形) |
核心类详解
1.QGraphicsItem(抽象基类)
- 所有图形项的基类。
- 子类包括:
QGraphicsRectItemQGraphicsEllipseItemQGraphicsTextItemQGraphicsPixmapItemQGraphicsPathItemQGraphicsLineItemQGraphicsPolygonItem- 以及可自定义的派生类(需重写
paint()和boundingRect())
2.QGraphicsScene
- 管理大量
QGraphicsItem。 - 支持碰撞检测、选中、焦点、事件传播等。
- 不直接显示,需通过
QGraphicsView显示。
3.QGraphicsView
- 继承自
QScrollArea,提供滚动区域。 - 可设置变换(如缩放
scale()、旋转rotate())。 - 可自定义渲染(如抗锯齿、OpenGL 后端)。
类关系简图
QGraphicsItem ←─── QGraphicsRectItem, QGraphicsTextItem, ... ↑ │ (owned by) QGraphicsScene ←───(displayed in)─── QGraphicsView ↑ │ (inherits) QObject注意:
QGraphicsView本身是一个 widget,内部使用QPainter渲染QGraphicsScene的内容。
三、其他高级绘图相关类
| 类 | 说明 |
|---|---|
QTransform | 表示 2D 仿射变换(平移、旋转、缩放、剪切) |
QPen/QBrush | 控制线条样式和填充样式,用于QPainter或QGraphicsItem |
QPainterPath | 描述复杂路径,可用于裁剪、填充或作为QGraphicsPathItem |
QStyleOptionGraphicsItem | 在自定义QGraphicsItem::paint()时传递样式信息 |
四、典型使用流程对比
基础绘图(QWidget + QPainter)
void MyWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.drawRect(10, 10, 100, 50); }高级绘图(Graphics View)
QGraphicsScene *scene = new QGraphicsScene; QGraphicsView *view = new QGraphicsView(scene); QGraphicsRectItem *rect = scene->addRect(10, 10, 100, 50); rect->setFlag(QGraphicsItem::ItemIsMovable); // 可拖动 view->show();总结
| 特性 | Paint System | Graphics View Framework |
|---|---|---|
| 适用场景 | 简单、静态绘图(如自定义控件) | 复杂、动态、交互式图形(如编辑器、游戏) |
| 性能 | 轻量,但管理大量对象效率低 | 高效(使用 BSP 树优化渲染与查找) |
| 交互 | 需手动处理事件 | 内置选中、拖拽、碰撞检测 |
| 缩放/平移 | 需手动实现 | 内置支持(QGraphicsView::scale()) |
如果你有具体应用场景(比如做矢量绘图软件、流程图编辑器、2D 游戏等),我可以进一步推荐合适的类组合和设计模式。