Qt 手动将QGraphicsView左上角移动到QGraphicsCenter中的某个点

Qt 手动将QGraphicsView左上角移动到QGraphicsCenter中的某个点,qt,qgraphicsview,qgraphicsscene,Qt,Qgraphicsview,Qgraphicsscene,我有一个QGraphicsView子类,在QWidget中持有一个qgraphicscene子类 qgraphicscene有一个实际的绘制矩形,其上角位于(0,0)(因此场景中确实有一个QRectF(-x,-y,w,h)的值与问题无关) 启动时,实际上在小部件的showEvent中,我将场景的大小设置为适合自定义大小的矩形。这也是它的中心 我想要的是,在开始时将场景的(0,0)点匹配到视图的左上角 与其他标题相同的问题不同,我实际上需要移动视图,而不是场景中的项目 图1:实际启动,图2:所需

我有一个
QGraphicsView
子类,在
QWidget
中持有一个
qgraphicscene
子类

qgraphicscene
有一个实际的绘制矩形,其上角位于(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);
}

无论是否使用对齐设置(我认为在其他地方可能会产生不必要的影响),这都会移动视图。。。太远了。

虽然一定有更好的方法。。。我想出了一种方法,通过执行两次
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);
}

虽然一定有更好的方法。。。我想出了一种方法,通过执行两次
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);
}

若我正确理解你们的问题,为了达到预期的效果,你们可以使用这种方法

QGraphicsView::setAlignment(Qt::Alignment):

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

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

QGraphicsView::setAlignment(Qt::Alignment):

在你的代码中有注释。
此方法与这些参数对齐视图的左上角,您不必移动或拟合任何对象。

我正在努力尝试像您一样在左上角创建标尺。我已经做了很多研究,尝试了很多不同的解决方案,但直到遇到这个问题,我才得到一个好的结果。我想知道你是否可以分享你如何创建它的代码?如果可以的话,谢谢你!:)我正在努力尝试在顶部和左侧创建一个标尺,就像您所做的那样。我已经做了很多研究,尝试了很多不同的解决方案,但直到遇到这个问题,我才得到一个好的结果。我想知道你是否可以分享你如何创建它的代码?如果可以的话,谢谢你!:)