2015-07-27 3 views
1

Я пытаюсь перемещать область просмотра, отображаемую графическим изображением. Согласно Qt documentation, это можно сделать, вызвав метод translate() класса QGraphicsView.QGraphicsView - просмотр навигации не работает

Я пытался сделать это без успеха до сих пор, и я пока не нашел объяснения этой проблемы. Может кто-нибудь мне помочь ? я создал простой пример, который показывает мою проблему:

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 имеет подклассы типа QGraphicsView. Вот его код:

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

Поскольку класс очень мал, я не думаю, что есть необходимость в обмене заголовков. Однако, если вы чувствуете, что я должен это сделать, просто опубликуйте комментарий, и я поделюсь ими.

ответ

1

Из QGraphicsView Doc:

QGraphicsView сохраняет центр вида фиксированный во время преобразования. Из-за выравнивания сцены (setAligment()), перевод изображения не будет иметь визуального воздействия.

Если ваша цель состоит в том, чтобы пройти всю сцену, вам фактически не нужно реализовывать keyPressEvent вообще, поскольку QAbstractScrollArea (наследуемый QGraphicsView) сделал это для вас. Единственное, что вам нужно убедиться в том, что сцена больше, чем ваш видовом, так попробуйте инициализацией

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

Если цель состоит в том, чтобы переместить перекрестие, состоящий из двух QGraphicsLineItems по сцене, то способ сделать это является:

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

это перебирает все элементы (использовать фактические итератор, если вам нравится) и перемещает их все в соответствии с вашими пожеланиями. Это не очень элегантное решение, но я считаю, что это не то, что вам нужно.

+0

Благодарим вас за ответ. То, что я пытался сделать, это ваше первое предположение, перемещение вокруг представления, пока сцена остается неизменной, но я не думал о том, что сцена слишком маленькая ... Это был лишь небольшой пример, мой настоящий случай немного бит другой. Но теперь моя проблема понятна. Спасибо :-) –