缩放QGraphicsView而不缩放已添加到其中的QWidget

Scale a QGraphicsView without Scaling a QWidget that has been added to it

本文关键字:缩放 QWidget 添加 QGraphicsView      更新时间:2023-10-16

我已经将QGraphicsView子类化,使其具有一些使其放大和缩小的轮子事件。滚动滚轮时,调用缩放功能,缩放GraphicsView

if(zoom_in)
{
factor = 2.0;
}
else
{
factor = 0.5;
}
this->scale(factor, factor);

这可以很好地工作,并缩放场景中设置为图形视图的项目(这是我想要的功能)。

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

我知道你可以设置忽略翻译,并且已经完成了

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

因此,当视图被缩放时,小部件不会改变大小,这是正确的,但由于某种原因,它确实会移动,放大时会向上和向左移动,缩小时会向右移动。

我根本不明白为什么会发生这种情况,因为如果只是移除ItemIgnoresTransformations标志并放大和缩小,它会完全保持在屏幕中心,但会改变大小,这显然不是我想要的

如果有人能对此有所了解,我将感谢的任何帮助

事实上,你观察到的是正常的。如果你不缩放项目,它将"看起来"转换,因为所有的图形视图都是缩放的。

实现目标的一种方法可能是定义一个根QGraphicsItem,并将您的小部件作为它的父级。在根项目的边界矩形函数中,您只需要在其中重新定位静态小部件,就可以避免这种翻译的印象。

IMO您不应该触摸QGraphicsView。最好的方法是拥有一些根QGraphicsItem(应该缩放的所有项的父项)
在场景中,可以有未缩放的项目(最顶端的父项未缩放),以及最顶端的子项正在处理鼠标滚轮事件并执行缩放的项目。


事实上,小部件的原点并没有移动(保持在相同的位置)。问题是,视图的中心很可能是缩放的中心,而您的小部件通过左上角连接到左上角
因此,为了解决这个问题,您可以强制项目的来源,标志ItemIgnoresTransformations位于缩放中心。因此,添加在缩放中心带有标志ItemIgnoresTransformations的伪QGraphicsItem,并使其成为小部件的父级。很可能您必须将小部件的位置设置为:widget.setPos(widget.width()/2, widget.height()/2)