使用 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);
  }
};