3

我在一个小部件上有一个 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因为它们是共享指针

4

3 回答 3

2

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

该项目忽略继承的转换(即,它的位置仍然锚定到其父级,但忽略父级或视图旋转、缩放或剪切转换)。

这就是你想要的。您已将项目添加到 QGraphcisItemGroup。为此,Qt 帮助指出: -

QGraphicsItemGroup 忽略其子项上的 ItemIgnoresTransformations 标志(即,相对于组项的几何形状,子项被视为可变形)。

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

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

于 2013-08-07T08:17:51.077 回答
2

好吧,ignoreTransformation 确实是一条正确的路。

QGraphicsItem::ItemIgnoresTransformations:项目忽略继承的转换(即,它的位置仍然锚定到其父级,但忽略父级或视图旋转、缩放或剪切转换)。这个标志对于保持文本标签项水平和未缩放很有用,因此如果视图被转换,它们仍然是可读的。设置后,项目的视图几何和场景几何将分别维护。您必须调用 deviceTransform() 来映射坐标并检测视图中的碰撞。默认情况下,此标志被禁用。这个标志是在 Qt 4.3 中引入的。

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

于 2013-08-06T15:14:19.467 回答
1

尝试在要保持大小不变​​的对象上设置 ItemIgnoresTransformations 标志。

于 2013-08-06T15:03:44.690 回答