如何使用QGraphicsView的缩放级别缩放QGraphicsEllipseItem

How to scale a QGraphicsEllipseItem with the Zoom Level of QGraphicsView

本文关键字:缩放 QGraphicsEllipseItem 何使用 QGraphicsView      更新时间:2023-10-16

我在一个小部件上有一个QGraphicsView,它正在向.添加一些项目

当我缩放图形视图时,其中一些是多边形,一些是椭圆(均为QGraphicsItems)

void Test::on_verticalSlider_sliderMoved(int position)
{
    ui->graphicsView->scale(1.1,1.1);
}

椭圆越来越大,但我希望它们缩小,这样无论我放大多远,它们基本上都保持不变,所以基本上我希望多边形放大,但不是我在这些多边形上绘制的点。。。如果这是合理的

不知道这会让事情变得更容易,但任何时候绘制的所有椭圆点都在同一个QGraphicsItemGroup内,所以我可以在整个组上设置一个标志来实现这一点?

不管怎样,如果能帮上这个,我将不胜感激

感谢

编辑------代码示例

item是QGraphicsEllipseItem,m_group_point是QGraphicsItemGroup

 item->setParentItem(m_group_point.get());

然后我将该组添加到场景

m_scene2->addItem(m_group_point.get());

然后将该场景添加到视图

ui->graphicsView->setScene(m_scene2.get());

它们是.get,因为它们是共享指针

嗯,ignoreTransformation确实是一个合适的方法。

QGraphicsItem::ItemIgnoresTransformations:该项忽略继承的变换(即,其位置仍固定到其父项,但忽略父项或视图旋转、缩放或剪切变换)。此标志有助于保持文本标签项的水平和不缩放,因此在转换视图时它们仍然可读。设置后,项目的视图几何体和场景几何体将分别保留。必须调用deviceTransform()来映射坐标并检测视图中的碰撞。默认情况下,此标志处于禁用状态。此标志在问题4.3中引入。

关于保持中间,您应该将场景中的椭圆移动到适当的位置,以便它们具有适当的场景坐标,然后您指示忽略视图的变换,以便它们忽略文档中提到的任何缩放/旋转等。

Qt文档说明了这一点关于标志QGraphicsItem::ItemIgnoresTransformations:-

该项忽略继承的转换(即其位置为仍然定位到其父对象,但父对象或视图旋转、缩放或剪切变换被忽略)。

这就是你想要的。您已将项目添加到QGraphcisItemGroup中。对此,Qt帮助声明:-

QGraphicsItemGroup忽略其子项(即,关于组项目的几何结构孩子们被当作是可变形的)。

了解到这一点,QGraphicsItem基于其父项使用ItemIgnoreTransformations标志,在您的情况下是QGraphicsGroup,但此类忽略其子项上的标志,这可能会导致您看到的问题。

因此,不要在父组上设置标志,而是在其子组上设置。

尝试在要保持恒定大小的对象上设置ItemIgnoresTransformations标志。