2011-04-12 142 views
2

我想創建一個QGraphicsView,這將允許某人縮放當前的QGraphicsItem以適合QGraphicsView窗口的大小。縮放QGraphicsItem以適合QGraphicsView

我重寫了QGraphicsItem來創建一個自定義版本,並且我實現了一些方法,因此它知道已經縮放了多少(它總是與原始比例成比例,所以只有一個比例因子 - 寬度相同,高度)。

所以在scaleFactor二傳手我有以下幾點:

void ImagePixmapItem::setScaleFactor(float sf){ 
    scaleFactor = sf; 
    this->boundingRect().setWidth(this->boundingRect().width()*scaleFactor); 
    this->boundingRect().setHeight(this->boundingRect().height()*scaleFactor); 

} 

而在我的主要形式,我有一個按鈕,如下:

QRect portRect = ui->graphicsView->viewport()->rect(); 
    double scaleFactorX; 
    if(portRect.width() <= (item->boundingRect().size().width())) 
     scaleFactorX =portRect.width() /(item->boundingRect().size().width()); 
    else 
     scaleFactorX = (item->boundingRect().size().width())/portRect.width(); 

    qDebug("Scalefactor: %4.3f \n", scaleFactorX); 
    qDebug("item width: %4.3f \n", item->boundingRect().size().width()); 
    qDebug("item height: %4.3f \n", item->boundingRect().size().height()); 
    item->setScaleFactor(scaleFactorX); 
    item->scale(scaleFactorX,scaleFactorX); 

哪裏item是那些ImagePixmapItem S的一個。

第一次使用時效果很好 - 我的圖像比視口大,並且它很好地縮小以適應窗口(至少寬度方向)。但是,如果我再次點擊該按鈕,則寬度和高度將返回相同的值scaleFactorXitem

你可以在圖像轉換後改變boundingRect嗎?如果不是,我該怎麼辦?

回答

2

首先,QGraphicsItem::boundingRect()返回rect的副本。改變它對實際物品沒有影響。要更改項目的幾何圖形,您需要覆蓋該函數並返回一個不同的矩形。當你真正改變它時,請致電prepareGeometryChange()

現在,如果您只想要在QGraphicsView的視口中適合該項目,請使用QGraphicsView::fitInView()

更改項目的轉換與更改從場景到視圖的轉換非常不同。前者改變物品相對於其他物品放置在場景中的方式。後者保持關係,隻影響場景如何「反映」到視圖上。

如果場景中有單個物品,它沒有多大區別。請記住,當你處理更復雜的場景時,項目轉換將處理世界的數學模型,而不是如何查看它。

編輯:

確定。現在我被餵食並重讀你的代碼。事實證明,你正在計算錯誤的比例因子。這是一個基本的,非測試代碼:

QRect itemSize = graphicsView->mapFromScene(item->sceneBoundingRect()).boundingRect().size(); 
QRect scaledSize =itemSize.scale(rgaphicsView->viewpoer().size(), Qt::KeepAspectRatio); 
double ratio = qMin((double)scaledSize.width()/itemSize().width(), (double)scaledSize.height()/itemSize().height()); 
item->setTransform(QTransform::fromScale(ratio,ratio), true); 

的要點是要用sceneBoundingRect,而不是boundingRect因爲boundingRect是該項目的本地範圍這始終是一樣的,不管項目的改造。並且在應用所有transformations之後sceneBoundingRect是界限。

+0

如果我使用fitInView,這實際上是否縮放ITEM本身?請記住,如果我在場景中有多個項目,我實際上想要操縱具有焦點的單個項目以適合視圖,而不僅僅是縮放,以便視圖本身得到縮放以適合視圖中的項目。 – Derek 2011-04-12 19:51:40

+0

I沒有意識到你確實想操縱單個項目的大小。那麼'fitToView'不是答案。抱歉。然而,你的'setScaleFactor()'完全沒有效果,因爲它只是設置一個臨時值。看到我的編輯縮放單個項目。 – 2011-04-12 21:59:52