按场景调整大小改变qgraphicsitem位置

时间:2015-09-12 09:35:12

标签: c++ qt resize qgraphicsview qgraphicsitem

我希望通过在图形视图上调整大小事件来更改QGraphicsItem位置。

我按newSize/oldSize缩放了位置,但我的物品保持在同一位置。 我不知道我的代码有什么问题,或者更改我的项目位置的更好方法。

bool cameraItems::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::Resize) {
        QResizeEvent *e = static_cast<QResizeEvent*>(event);
        if(obj == ui->graphicsView) {
                setFixedSizeForGraphicsView(e->size(), e->oldSize());
                ui->graphicsView->scene()->setSceneRect(0, 0, e->size().width(), e->size().height());
                ui->graphicsView->setSceneRect(0, 0, e->size().width(), e-->size().height());
        }
    }
    QWidget::eventFilter(obj, event);
}



void cameraItems::setFixedSizeForGraphicsView(QSize size, QSize oldSize)
{
    foreach (singleCamera *cam, m_cameras) {
            prevImageSize = cam->imageSize();
        QPointF ppos = cam->pos();
        QPointF newPos = QPointF((ppos.x()/prevSize.width())*size.width(), (ppos.y()/prevSize.height())*size.height());
        cam->setPos(newPos);
    }
}

1 个答案:

答案 0 :(得分:1)

您可以创建继承自QGraphicsView的自定义类,然后重新实现resizeEvent( QResizeEvent *event ),如下所示:

void MyView::resizeEvent(QResizeEvent *event)
{
    QRectF rect = this->scene()->itemsBoundingRect();
    fitInView(rect, ,Qt::KeepAspectRatio);

    QGraphicsView::resizeEvent(event);
}

这样,视图将始终显示整个场景。即如果更改了窗口大小并调整了graphicsView的大小,则场景会缩放,您可以正确地看到所有内容。