2014-01-10 46 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,並使用您的窗口小部件。在根項目的邊界矩的函數中,您只需重新輸入靜態小部件就可以避免這種翻譯印象。