QGraphicsView -视图导航不工作

QGraphicsView - view navigation not working

本文关键字:工作 导航 视图 QGraphicsView      更新时间:2023-10-16

我正试图移动由GraphicsView显示的视口。根据Qt文档,这可以通过调用QGraphicsView类的translate()方法来完成。

到目前为止,我已经尝试过了,但没有成功,到目前为止,我还没有找到这个问题的解释。有人能帮我吗?我创建了一个简单的例子来显示我的问题:
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();
}

由于类非常小,我认为没有必要共享头文件。但是,如果你觉得我应该这样做,请发表评论,我将分享它们。

从QGraphicsView文档:

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

这遍历所有项(如果您喜欢,可以使用实际的迭代器)并根据您的意愿移动它们。这不是一个非常优雅的解决方案,但我相信这不是你想要的。