使用 QGraphicsView 平移缩放和旋转

QGraphics 可用于将可视对象的复杂场景组织到框架中,使其更易于处理。

在此框架 QGraphicsViewQGraphicsSceneQGraphicsItems 中使用了三种主要类型的对象。QGraphicsItems 是场景中存在的基本视觉项目。

有许多类型是预先构建的并且可以使用,例如椭圆线路径Pixmaps多边形矩形文本

你也可以通过继承 QGraphicsItem 来制作自己的物品。然后将这些物品放入 QGraphicsScene,这基本上就是你计划看的世界。物品可以在场景中移动,就像让它们在你正在看的世界中移动一样。项目定位和方向由称为 QTransforms 的变换矩阵处理。Qt 内置了很好的功能,因此你通常不需要直接使用 QTransforms,而是调用旋转或缩放等功能,为你创建适当的变换。然后通过 QGraphicsView 中定义的透视图(再次使用 QTransforms)查看场景,这是你在 UI 中放入窗口小部件的部分。

在下面的示例中,有一个非常简单的场景,只有一个项目(像素图),它被放入场景并显示在视图中。通过打开 DragMode 标志,可以使用鼠标平移场景,通过使用缩放和旋转功能,可以使用鼠标滚动缩放场景并使用箭头键旋转。

如果你想运行此示例,请创建将显示的 View 实例,并使用包含图像 my_image.png 的前缀/ images 创建一个资源文件。

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPixmapItem>
#include <QWheelEvent>
#include <QKeyEvent>

class View : public QGraphicsView
{
  Q_OBJECT
public:
  explicit View(QWidget *parent = 0) :
    QGraphicsView(parent)
  {
    setDragMode(QGraphicsView::ScrollHandDrag);

    QGraphicsPixmapItem *pixmapItem = new QGraphicsPixmapItem(QPixmap(":/images/my_image.png"));
    pixmapItem->setTransformationMode(Qt::SmoothTransformation);

    QGraphicsScene *scene = new QGraphicsScene();
    scene->addItem(pixmapItem);
    setScene(scene);
  }

protected Q_SLOTS:
  void wheelEvent(QWheelEvent *event)
  {
    if(event->delta() > 0)
      scale(1.25, 1.25);
    else
      scale(0.8, 0.8);
  }

  void keyPressEvent(QKeyEvent *event)
  {
    if(event->key() == Qt::Key_Left)
      rotate(1);
    else if(event->key() == Qt::Key_Right)
      rotate(-1);
  }
};