2013-07-09 101 views
1

我有一個QGraphicsScene和一個顯示它的QGraphicsView。我需要添加一個QGraphicsItem到場景,並保持它在同一個位置,即使我滾動視圖。我試圖覆蓋視圖的scrollContentsBy()方法,如下所示,但它沒有做到這一點。如何在滾動QGraphicsView時移動QGraphicsItem?

void FETimelineView::scrollContentsBy(int dx, int dy) 
{ 
    QGraphicsView::scrollContentsBy(dx, dy); 

    QRectF oRect = p_CatBar->rect(); 
    p_CatBar->setPos(oRect.x() + dx, oRect.y() + dy); 
} 

順便說一句,FETimelineView是我的QGraphicsView和p_CatBar的類型的QGraphicsItem的。請提前幫助,謝謝。

回答

3

而不是通過滾動的數量來移動它,你可以得到你想要它相對於視圖的位置,然後根據它來直接設置它。所以它會是這樣的: -

// Assuming that the Graphics Item top left needs to be at 50,50 
// and has a width and height of 30,20 

void FETimelineView::scrollContentsBy(int dx, int dy) 
{ 
    QGraphicsView::scrollContentsBy(dx, dy); 

    // get the item's view position in scene coordinates 
    QRect scenePos = mapToScene(QRect(50, 50, 30, 20)); 
    p_CatBar->setPos(scenePos); 
} 
+0

非常感謝。此解決方案有效。 – kasper360

1

我認爲更簡單的方法實際上是您所要求的相反方法:嘗試在QGraphicsItem::GraphicsItemFlags中設置標記ItemIgnoresTransformations

還有其他標誌可以幫助你,看文檔。

+0

帶此標誌的項目將忽略縮放和旋轉,但不會忽略視圖的滾動。視圖的滾動不作爲真正的轉換應用於場景。 –