Sök…


Panorera, zooma och rotera med QGraphicsView

QGraphics kan användas för att organisera komplicerade scener med visuella objekt i en ram som gör dem lättare att hantera.

Det finns tre huvudtyper av objekt som används i detta ramverk QGraphicsView , QGraphicsScene och QGraphicsItems . QGraphicsItems är de grundläggande visuella objekt som finns i scenen.

Det finns många typer som är förbyggda och kan användas som ellipser , linjer , vägar , pixmaps , polygoner , rektanglar och text .

Du kan också skapa dina egna föremål genom att ärva QGraphicsItem . Dessa artiklar läggs sedan in i en QGraphicsScene som i princip är den värld du planerar att titta på. Objekten kan röra sig inom scenen som är som att få dem att röra sig i den värld du tittar på. Objektets positionering och orientering hanteras av transformationsmatriser som kallas QTransforms . Qt har fina funktioner inbyggda så att du vanligtvis inte behöver arbeta med QTransforms direkt, istället kallar du funktioner som rotera eller skala som skapar rätt transformationer för dig. Scenen ses sedan av det perspektiv som definieras i QGraphicsView (igen med QTransforms ), vilket är det stycke du skulle lägga till i en widget i ditt användargränssnitt.

I följande exempel finns det en mycket enkel scen med bara ett objekt (en pixmap), som läggs in i en scen och visas i en vy. Genom att slå på DragMode flaggan kan scenen panoreras runt med musen och genom att använda skala och rotera funktioner kan den skalas in och ut med rullningen på musen och roteras med piltangenterna.

Om du vill köra det här exemplet skapar en instans av View som ska visas och skapa en resurs fil med prefixet / bilder som innehåller en bild my_image.png.

#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);
  }
};


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow