2011-04-12 99 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