2015-07-27 1 views
1

J'essaie de me déplacer dans la fenêtre affichée par GraphicsView. Selon Qt documentation, cela peut être fait en appelant la méthode translate() de la classe QGraphicsView.QGraphicsView - voir la navigation ne fonctionne pas

J'ai essayé de le faire sans succès jusqu'à présent et je n'ai pas trouvé d'explication à ce problème jusqu'à présent. Quelqu'un peut-il m'aider ? J'ai créé un exemple simple qui montre mon problème:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 

    QGraphicsScene *scene = new QGraphicsScene(); 
    ui->graphicsView->setScene(scene); 
    ui->graphicsView->scene()->addItem(new QGraphicsLineItem(0,-10, 0,10)); 
    ui->graphicsView->scene()->addItem(new QGraphicsLineItem(-10,0, 10,0)); 
} 

MainWindow::~MainWindow() 
{ 
    delete ui; 
} 

graphicsView est d'un type de sous-classé QGraphicsView. Voici le code:

MyGraphicsView::MyGraphicsView(QWidget *parent) 
    : QGraphicsView(parent) 
{ 
} 

void MyGraphicsView::keyPressEvent(QKeyEvent *event) 
{ 
    if (event->key() == Qt::Key_Up) 
     translate(0, 10); 
    else if (event->key() == Qt::Key_Down) 
     translate(0, -10); 
    else if (event->key() == Qt::Key_Left) 
     translate(-10, 0); 
    else if (event->key() == Qt::Key_Right) 
     translate(10, 0); 

    update(); 
} 

Comme la classe est très petite, je ne pense pas qu'il y ait un besoin de partager les en-têtes. Cependant, si vous pensez que je devrais le faire, il suffit de poster un commentaire et je vais les partager.

Répondre

1

De la doc QGraphicsView:

QGraphicsView maintient le centre de la vue fixe lors d'une transformation. En raison de l'alignement de la scène (setAligment()), la traduction de la vue n'aura aucun impact visuel. Si votre but est de parcourir toute la scène, vous n'avez pas besoin d'implémenter keyPressEvent, car QAbstractScrollArea (dont hérite QGraphicsView) l'a fait pour vous. La seule chose que vous devez vous assurer que la scène est plus grande que votre fenêtre, alors essayez d'initialisation

QGraphicsScene *scene = new QGraphicsScene(0,0,1500,1500); 
ui->graphicsView->setScene(scene); 
ui->graphicsView->scene()->addItem(new QGraphicsLineItem(750,730, 750,770)); 
ui->graphicsView->scene()->addItem(new QGraphicsLineItem(730,750, 770,750)); 

Si votre but est de déplacer le réticule composé des deux QGraphicsLineItems sur la scène, puis une façon de le faire est:

void MyGraphicsView::keyPressEvent(QKeyEvent *event) 
{ 
    int i; 
    if (event->key() == Qt::Key_Up){ 
    for (i = 0; i < items().count(); i++) 
     items().takeAt(i)->moveBy(0,-10);//-10, origin is top left 
    } 
    else if (event->key() == Qt::Key_Down){ 
    for (i = 0; i < items().count(); i++) 
     items().takeAt(i)->moveBy(0,10); 
    } 
    else if (event->key() == Qt::Key_Left){ 
    for (i = 0; i < items().count(); i++) 
     items().takeAt(i)->moveBy(-10,0); 
    } 
    else if (event->key() == Qt::Key_Right){ 
    for (i = 0; i < items().count(); i++) 
     items().takeAt(i)->moveBy(10,0); 
    } 

    update(); 
} 

Ce itère à travers tous les éléments (utilisez un itérateur réelle si vous le souhaitez) et les déplace tous selon vos souhaits. Ce n'est pas une solution très élégante, mais je crois que ce n'est pas ce que vous recherchez.

+0

Nous vous remercions de votre réponse. Ce que j'essayais de faire, c'est d'abord deviner, en tournant la vue pendant que la scène reste inchangée, mais je ne pensais pas à la scène trop petite ... Ce n'était qu'un petit exemple, mon vrai cas est un peu Un peu différent. Mais mon problème est maintenant compris. Merci :-) –