将QGraphicsView左上角移动到QGraphicsScene中的某个点

时间:2016-02-23 21:25:47

标签: qt qgraphicsview qgraphicsscene

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

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

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

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

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

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

actual desired

我在尝试:

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

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

2 个答案:

答案 0 :(得分:5)

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

QGraphicsView :: setAlignment(Qt :: Alignment alignment):

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

您的代码中有评论。 这些参数的方法与左上角对齐,你不必移动或适合任何东西。

答案 1 :(得分:0)

虽然必须有更好的方法......我想办法通过两次fitInView来对齐我的0:

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