【问题标题】:Zoom QGraphicsItem to fit QGraphicsView缩放 QGraphicsItem 以适应 QGraphicsView
【发布时间】:2011-08-04 00:17:25
【问题描述】:

我正在尝试创建一个QGraphicsView,它允许某人缩放当前QGraphicsItem 以适应QGraphicsView 窗口的大小。

我已经覆盖了QGraphicsItem 来创建一个自定义版本,并且我实现了一些方法,所以它知道它被缩放了多少(它总是与原始比例成正比,所以只有一个比例因子 - 宽度相同和高度)。

所以在scaleFactor setter 中我有以下内容:

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);

其中itemImagePixmapItems 之一。

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

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

【问题讨论】:

    标签: c++ qt qt4 qgraphicsview qgraphicsitem


    【解决方案1】:

    首先,QGraphicsItem::boundingRect() 返回 rect 的副本。更改它对实际项目没有影响。要更改项目的几何形状,您需要覆盖该函数并返回不同的矩形。并在实际更改时致电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之后的边界。

    【讨论】:

    • 如果我使用 fitInView,这真的会缩放 ITEM 本身吗?请记住,如果我在场景中有多个项目,我实际上想要操纵具有焦点的单个项目以适合视图,而不仅仅是缩放以便缩放视图本身以适应视图中的项目跨度>
    • 我没有意识到您确实想要操纵单个项目的大小。那么fitToView 不是答案。对不起。但是,您的 setScaleFactor() 根本没有任何效果,因为它只是设置了一个温度。请参阅我的编辑以缩放单个项目。
    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2013-06-17
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多