Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QGraphicsView-视图导航不工作_C++_Qt_Qgraphicsview - Fatal编程技术网

C++ QGraphicsView-视图导航不工作

C++ QGraphicsView-视图导航不工作,c++,qt,qgraphicsview,C++,Qt,Qgraphicsview,我试图在GraphicsView显示的视口中移动。根据,这可以通过调用QGraphicsView类的translate()方法来完成 到目前为止,我已经尝试过这样做,但没有成功,我还没有找到这个问题的解释。有人能帮我吗? 我创建了一个简单的示例来说明我的问题: MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this

我试图在GraphicsView显示的视口中移动。根据,这可以通过调用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,因为QBStractScrollArea(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));
如果您的目的是在场景中移动由两个QGraphicsLineItem组成的十字线,则可以使用以下方法:

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();
}
void MyGraphicsView::keyPressEvent(QKeyEvent*事件)
{
int i;
如果(事件->键()==Qt::键向上){
对于(i=0;imoveBy(0,-10);//-10,原点在左上角
}
否则如果(事件->键()==Qt::键按下){
对于(i=0;imoveBy(0,10);
}
else if(事件->键()==Qt::键左){
对于(i=0;imoveBy(-10,0);
}
else if(event->key()==Qt::key\u Right){
对于(i=0;imoveBy(10,0);
}
更新();
}

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

谢谢您的回答。我想做的是你的第一个猜测,在场景保持不变的情况下在视图中移动,但我没有想到场景太小。。。这只是一个小例子,我的真实情况有点不同。但我的问题现在被理解了。谢谢:-)可能的副本