2014-01-10 44 views
0

我已经子类化QGraphicsView有一些轮子事件,使它放大和缩小。当车轮滚动缩放功能被称为其缩放GraphicsView缩放一个QGraphicsView而不缩放已添加到它的QWidget

if(zoom_in) 
{ 
    factor = 2.0; 
} 
else 
{ 
    factor = 0.5; 
} 

this->scale(factor, factor); 

这工作正常和规模是上被设置为graphicsview(这是我想要的功能)场景中的物品。

但是我也有一个QWidget添加到这个场景。该小部件应该基本上是QGraphicsView的背景,它具有相同的尺寸,并调整大小以适应视图调整大小时的视图。

林知道,你可以设置忽略的翻译就行了这

proxyWidget = this->scene()->addWidget(myBackgroundWidget); 
proxyWidget->setFlag(QGraphicsItem::ItemIgnoresTransformations); 

所以当视图缩放控件并没有改变大小,这是正确的,但它确实动了某些原因,它上移在缩小时向左和向右缩放。

我不知道为什么发生这种情况在所有的,因为如果只是删除ItemIgnoresTransformations标志和放大和缩小它在屏幕上,但改变大小的中心,这显然不是我想要的完美仍然

如果任何人都可以在这一点上,我将不胜感激

回答

1

国际海事组织你不应该触摸QGraphicsView。最好的方法是拥有一些根QGraphicsItem(应缩放的所有项目的父项)。
比在场景中,您可以拥有未缩放的项目(最顶级的父级未缩放),而顶级父级最多的项目处理鼠标滚轮事件并执行缩放。


事实上,您的小部件的起源不会移动(保持在同一位置)。 问题是,视图中心最有可能是缩放中心,您的小部件通过左上角附加到左上角。
所以要解决这个问题,你可以强制执行标记为ItemIgnoresTransformations的项目的原点位于缩放中心。所以添加假的QGraphicsItem标志ItemIgnoresTransformations在缩放的中心,并使其为您的部件的父。很可能你必须将小部件的位置设置为:widget.setPos(widget.width()/2, widget.height()/2)

+0

需要缩放的所有东西都放在一个QGraphicsItem组中,但是它们本身不应缩放,它们都放置在场景中,我只希望场景缩放,即物品保持相同的大小,但它们的布局是缩放的。它们是图像上的标记,所以我希望标记具有相同的大小,但场景需要缩放,否则它们都保持同一个缩放级别的相同布局。 – AngryDuck

1

实际上你观察到的是正常的。如果你没有缩放这个项目,它会“翻译”,因为所有的图形视图都被缩放了。

实现您的目标的一种方法可能是定义一个根QGraphicsItem,并使用您的窗口小部件。在根项目的边界矩的函数中,您只需重新输入静态小部件就可以避免这种翻译印象。