2015-04-02 134 views
0

我有一個簡單的gui它有兩個QGraphicsViews在裏面。一旦你運行應用程序,它會加載一個圖像並在兩個視圖中顯示它。然後,您可以繼續選擇一些簡單的操作,然後按下按鈕以查看它們僅對右側的圖像有效。如何同步兩個QGraphicsViews?

我認爲會很好的是能夠在放大其中一幅圖像時進行平移,另一幅圖像可以跟進。因此,如果您想專注於某個圖像上的特定區域,則另一個圖像上也會發生完全相同的情況。

我看不出我是如何獲得有關我在其中一個GraphicsViews中看到的信息,以便同步其他對象的。

這是可能的,如果是的話,我會繼續做下去嗎?

編輯1 已經取得了一些進展,但仍然存在一些問題。 我決定要做的是取相對於場景的視區幾何圖形。

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

,然後嘗試並將其設置爲幾何形狀對於其他場景

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

的視口,但是這產生了其中第二圖像移動到一個方向相反的一個我移動的效果第一張照片。它應該遵循的那個。此外,它將第二個圖像移動到QGraphicsView的角落,如下所示。請注意,當我嘗試調整窗口大小時,只有在調整大小時,圖像會在中間返回。如果你使用

m_workspace2->setSceneRect(viewport5); 
+0

有些插槽...? – 2015-04-02 07:19:46

回答

0

答案似乎並不全是那麼難。

使用

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

得到一個矩形,它顯示你什麼你的場景的一部分是當前可見。

然後,只需在你的第二個觀點

m_workspace2->setSceneRect(viewport1); 

會發生這種情況每次移動圖像的一個時間,或者放大,通過截取鼠標事件,或者如果你不在乎所有更新的場景那麼只需要子類QGraphicsView並使用'paintEvent'在每次重繪圖像時發出一個信號。

+0

有趣的解決方案,所以你只是重複從一個視圖到另一個場景矩形的變化..我不知道是否有一些QGraphicsView的信號,當視圖的邊界切換時會發出..但也許在paintEvent中調用它就足夠了。您可以將自己的問題標記爲正確的。 – nayana 2015-04-13 13:40:18

+0

@otopolsky我在文檔中搜索過,似乎沒有這樣的信號發出。但是有一種方法可以檢測到圖像拖動事件,但事情並不那麼困難(LMB必須壓在widget上方,鼠標必須移動)。 – dearn44 2015-04-14 06:52:47

0

我認爲正從第一視圖中的視口,然後將它傳遞給下一個視圖會做的伎倆

enter image description here

EDIT2 特的問題得到解決。

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

的確,或者可能使用** CenterOn **。但是,如何知道視口何時更改,是否存在某種信號? – dearn44 2015-04-02 07:44:36

+0

我剛剛嘗試在芯片示例中設置視口,並且由於某種原因它不工作。也許你可以重新實現viewportEvent函數或其中一些paintEvent(),mousePressEvent(),mouseReleaseEvent(),mouseDoubleClickEvent(),mouseMoveEvent(),wheelEvent(),dragEnterEvent(),dragMoveEvent(),dragLeaveEvent(),dropEvent()等。 contextMenuEvent(),resizeEvent() – nayana 2015-04-02 08:02:24

+0

這就是我想到的。我會盡力去做,看看它是如何發展的。 – dearn44 2015-04-02 08:11:50