2

我正在尝试创建一个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

这在第一次时效果很好 - 我的图像比视口大,并且它可以很好地缩小以适合窗口(至少在宽度方面)。scaleFactorX但是,如果我再次按下按钮,item宽度和高度的相同值会返回。

boundingRect转换后的图像可以更改吗?如果没有,我该怎么办?

4

1 回答 1

3

首先,QGraphicsItem::boundingRect()返回一个矩形的副本。更改它对实际项目没有影响。要更改项目的几何形状,您需要覆盖该函数并返回不同的矩形。prepareGeometryChange()当你真正改变它时打电话。

现在,如果您只想在 QGraphicsView 的视口中放置项目,请使用QGraphicsView::fitInView().

改变一个项目的变换与改变从场景到视图的变换是非常不同的。前者改变了项目相对于其他项目在场景中的放置方式。后者保持关系并且只影响场景如何“反映”到视图上。

如果场景中有单个项目,则没有太大区别。请记住,当您处理更复杂的场景时,项目转换处理的是您世界的数学模型,而不是如何查看它。

编辑:

我刚刚重读了你的代码。事实证明,您计算的比例因子错误。这是一个基本的、未经测试的代码:

QRect itemSize = graphicsView->mapFromScene(item->sceneBoundingRect()).boundingRect().size();
QRect scaledSize =itemSize.scale(graphicsView->viewport().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是项目本地边界,无论项目转换如何,它总是相同的。而sceneBoundingRect是所有transformations应用后的边界。

于 2011-04-12T17:39:17.367 回答