如何在不超出显示区域的情况下缩放QGraphicItem?

时间:2018-06-27 12:19:46

标签: qt

我有一个带有场景(图形视图)的应用程序。在此场景中,用户可以创建汽车,并且当他使用汽车上的上下文菜单时,会在5米处显示属性列表。现在,当用户缩放时,属性列表超出显示区域,有时5米距离汽车太远。我如何确保它始终位于可见区域或放大时将其拉近。 实现的代码段:

void ObjectGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget /*= nullptr*/) {
    auto carMiddle = mapToScene(transformOriginPoint());
    carMiddle.rx() += 5.0;
    carMiddle.ry() += 5.0;
    auto overlayPos = mapFromScene(carMiddle);
    overlayPos = PropertyWidget.moveInScreenCoords(overlayPos, {0.0, static_cast<float>(objectNameClassOverlay.widget()->height()) + 5.0f});
}

QPointF PropertyWidgetClass::moveInScreenCoords(QPointF &dest, const QPointF &delta) {
    if (scene() == nullptr) return dest;
    auto views = scene()->views();
    if (views.size() < 1) return dest;
    auto firstView = views.first();

    setFlag(QGraphicsItem::ItemIgnoresTransformations, false);
    auto r = deviceTransform(firstView->viewportTransform()).map(dest);
    r = deviceTransform(firstView->viewportTransform()).inverted().map(r + delta);
    setFlag(QGraphicsItem::ItemIgnoresTransformations, true);
    return r;
}

enter image description here

0 个答案:

没有答案