如何同步两个QGraphicsView?

时间:2015-04-02 07:18:24

标签: c++ qt

我有一个简单的 gui ,里面有两个 QGraphicsViews 。运行应用程序后,它会加载图像并在两个视图中显示它。然后,您可以继续选择一些简单的操作,然后按一个按钮,看它们只对右侧的图像有效。

我认为很棒的是能够在平移其中一个图像时进行平移,另一个要跟进。因此,如果你想专注于一个图像上的特定区域,那么另一个图像上也会发生完全相同的事情。

我无法看到如何获取有关我在其中一个GraphicsView中看到的内容的信息,以便同步另一个。

这是可能的,如果是的话,我将如何继续这样做?

EDIT1 虽然取得了一些进展,但仍存在一些问题。 我决定采取相对于场景的视口几何。

QRectF viewport5 = m_workspace1->mapToScene(m_workspace1->viewport()->geometry()).boundingRect();

然后尝试将其设置为另一个场景的视口的几何体

m_workspace2->viewport()->setGeometry(viewport5.toRect());

但这会产生一种效果,即第二张图像移动到与我移动第一张图片的方向相反的方向。它应该遵循的那个。此外,它将第二个图像移动到QGraphicsView的角落,如下所示。请注意,当我尝试调整窗口大小时,只有在我调整大小时,图像才会在中间返回。

enter image description here

EDIT2 如果您使用

,问题就会得到解决
m_workspace2->setSceneRect(viewport5);

2 个答案:

答案 0 :(得分:0)

我认为从第一个视图获取视口然后将其传递到下一个视图就可以了。

QWidget *viewport1 = view1->viewport();
view2->setViewport(viewport1);

答案 1 :(得分:0)

答案似乎并不那么难。

使用

QRectF viewport1 = m_workspace1->mapToScene(m_workspace1->viewport()->geometry()).boundingRect();

获取一个矩形,显示当前可见的场景部分。

然后只需在第二个视图中更新场景

m_workspace2->setSceneRect(viewport1);

每次移动其中一个图像或通过拦截鼠标事件放大时都会发生这种情况,或者如果您不关心那么多,那么只需将QGraphicsView子类化并使用“paintEvent”每次发出一个信号你的图像被重新粉刷。