【问题标题】:Move QGraphicsView top left to a certain point in QGraphicsScene manually手动将 QGraphicsView 左上角移动到 QGraphicsScene 中的某个点
【发布时间】:2018-06-17 23:37:53
【问题描述】:

我有一个QGraphicsView 子类,在QWidget 内拥有一个QGraphicsScene 子类。

QGraphicsScene 有一个实际的绘图矩形,其顶角位于 (0,0)(因此场景确实有一个与问题无关的 QRectF(-x,-y,w,h) 值)。

在启动时,实际上在小部件的showEvent 中,我设置了场景的大小以适合自定义大小的矩形。这也是它的中心。

我想要的是在开始时将场景的 (0,0) 点与视图的左上角匹配。

与其他同名问题不同,我实际上需要移动视图,而不是场景中的项目。

图1:实际开始,图2:期望

我正在尝试:

void MyWidget::showEvent(QShowEvent *event)
{
    static bool startUp = true;
    if(startUp)
    {
        QSizeF sz = m_scene->getActualSize();
        ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio);

        QPointF zero = ui->graphicsView->mapFromScene(QPointF(0,0));
        ui->graphicsView->translate(-zero.x(), -zero.y()); // or positive

        startUp = false;
    }
    QWidget::showEvent(event);
}

注意:我使用 fitInView 来获得所需的缩放 - 它还使所需的矩形成为焦点 - 但在视图中居中。

我也试过了

void GraphicsView::alignToZero()
{
    QPointF zero = this->mapFromScene(QPointF(0,0));
    this->scrollContentsBy(-zero.x(), -zero.y());
}

void MyWidget::showEvent(QShowEvent *event)
{
    static bool startUp = true;
    if(startUp)
    {
        QSizeF sz = m_scene->getActualSize();
        ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio);

        ui->graphicsView->alignToZero();

        startUp = false;
    }
    QWidget::showEvent(event);
}

还是没有结果。

也试过

void MyWidget::showEvent(QShowEvent *event)
{
    static bool startUp = true;
    if(startUp)
    {
        QSizeF sz = m_scene->getActualSize();
        ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio);

        QPointF zero = ui->graphicsView->mapFromScene(QPointF(0,0));
        //ui->graphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop);
        ui->graphicsView->horizontalScrollBar()->setValue(zero.x());
        ui->graphicsView->verticalScrollBar()->setValue(zero.y());

        startUp = false;
    }
    QWidget::showEvent(event);
}

无论有没有对齐设置(我认为这可能会在其他地方产生不良影响),这都会将视图移动......太远了。

【问题讨论】:

    标签: qt qgraphicsview qgraphicsscene


    【解决方案1】:

    如果我正确理解你的问题,你可以使用方法来达到预期的效果

    QGraphicsView::setAlignment(Qt::Alignment 对齐方式):

    ui->graphicsView->setAlignment( Qt::AlignTop | Qt::AlignLeft );
    

    在您的代码中已注释。 此方法与这些参数对齐视图左上角,您不必移动或适应任何东西。

    【讨论】:

      【解决方案2】:

      虽然必须有更好的方法...我想出了一种方法来让我的 0 对齐两次 fitInView

      void MyWidget::showEvent(QShowEvent *event)
      {
          static bool startUp = true;
          if(startUp)
          {
              QSizeF sz = m_scene->getActualSize();
              // First I do a normal `fitInView` that centers the rectangle
              ui->graphicsView->fitInView(QRectF(0, 0, sz.width(), sz.height()), Qt::KeepAspectRatio);
      
              // Then, knowing the shift, I fit it again adding twice the shift to the size.
              QPointF zero = ui->graphicsView->mapToScene(QPoint(0,0));
              ui->graphicsView->fitInView(QRectF(0, 0, sz.width() - 2 * zero.x(), sz.height() - 2 * zero.y()), Qt::KeepAspectRatio);
      
              startUp = false;
          }
          QWidget::showEvent(event);
      }
      

      【讨论】:

      • 我正在努力尝试像您一样在顶部和左侧创建一个标尺。我一直在做很多研究并尝试了许多不同的解决方案,但在遇到这个问题之前从未达到过好的结果。我想知道您是否可以分享有关如何创建它的代码?可以的话谢谢! :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      相关资源
      最近更新 更多