QGraphicsView 和 QGraphicsScene 是 Qt 图形框架中的两个重要类,用于创建和管理图形界面。它们之间的区别如下:
- 功能角色:
- QGraphicsView:QGraphicsView 是一个可视化的视图窗口,用于显示 QGraphicsScene 中的图形项。它提供了具体的界面展示和用户交互功能,如缩放、平移、旋转等操作。
- QGraphicsScene:QGraphicsScene 是一个二维场景,用于管理和组织图形项(QGraphicsItem)。它负责图形项的布局、排序、渲染以及接收和处理与输入设备相关的事件。
- 显示关系:
- QGraphicsView 依赖于 QGraphicsScene,将 QGraphicsScene 中的图形项显示在其视图窗口中。通过设置 QGraphicsView 的场景属性,可以指定所使用的 QGraphicsScene 对象。
- QGraphicsScene 可以存在独立于 QGraphicsView 的情况下,也就是说可以创建 QGraphicsScene 对象,但不将其连接到任何 QGraphicsView。
- 视图控制:
- QGraphicsView 提供了各种视图控制功能,如缩放、平移和旋转。这使得你可以更改图形场景在视图中的显示方式,以适应用户的需求。
- QGraphicsScene 则关注于图形项的管理和呈现,不直接控制视图的行为。它负责处理图形项的布局、更新和事件。
综上所述,QGraphicsView 是用于呈现 QGraphicsScene 中的图形项并提供用户交互功能的视图窗口,而 QGraphicsScene 则是用于管理和组织图形项的二维场景。
view可以理解为窗户,scene就是窗户外的世界。
scene只可能被item撑得更大,不能自动变小。
cebterOn
centerOn就是将view的中心点和scene的哪个位置对齐,就像摄像机转向世界的某一个位置,所以centerOn的参数就是scene的坐标位置
void ImageViewer::mousePressEvent(QMouseEvent* event) { qDebug() << event->pos(); qDebug() << "width:" << this->width() << ", height:" << this->height(); }
event->pos()
的坐标系是基于ImageViewer的坐标系,也就是event->pos()
的最大值就是width,height。
2种方式效果都是等价的
// 方式1 QTransform transform = this->transform(); this->setTransform(transform.scale(scaleFactor, scaleFactor)); // 方式2 this->scale(scaleFactor, scaleFactor);
int width = this->viewport()->width(); // this->widht和this->viewport()->withd是不相等的,因为有边框 int height = this->viewport()->height(); QPointF center = this->mapToScene(QPoint(width / 2.0, height / 2.0)); QPointF offset = center - sceneMousePos; this->centerAnchor = sceneMousePos + offset; this->centerOn(this->centerAnchor);