QTransform 比例和 boundingRect.size() 之间的关系
Posted
技术标签:
【中文标题】QTransform 比例和 boundingRect.size() 之间的关系【英文标题】:Relation between QTransform scale and boundingRect.size() 【发布时间】:2015-05-15 08:55:24 【问题描述】:我不太关心 QGraphicsItem 的 boundingRect() 方法中 QTransform 比例与宽度和高度返回值之间的关系。 实际上,我想将 QGraphicsItem 缩放为其 boundingRect 大小。即,如果我的项目大小最初为 100,100,我在 boundingRect() 方法中传递,之后我通过 mousemove 事件增加项目的大小。如果我增加的宽度和高度分别为 400,300,我的比例因子是 4,3? 任何帮助都将不胜感激。
这是代码
this->setPos(minMax().first.x(), minMax().first.y());
qreal w = minMax().second.x() - minMax().first.x();
qreal h = minMax().second.y() - minMax().first.y();
qreal scaleFactorW = w / boundingRect().width();
qreal scaleFactorH = h / boundingRect().height();
QTransform trans;
trans.scale(scaleFactorW, scaleFactorH);
setTransform(trans);
bottomPoints = QPointF(w, h);
minMax 函数为:
float xMin = 0, xMax = 0, yMin = 0, yMax = 0;
QList<double> xValues, yValues;
xValues << shaper[0]->scenePos().x() << shaper[1]->scenePos().x() << shaper[2]->scenePos().x() << shaper[3]->scenePos().x() << shaper[4]->scenePos().x() << shaper[5]->scenePos().x() << shaper[6]->scenePos().x() << shaper[7]->scenePos().x();
yValues << shaper[0]->scenePos().y() << shaper[1]->scenePos().y() << shaper[2]->scenePos().y() << shaper[3]->scenePos().y() << shaper[4]->scenePos().y() << shaper[5]->scenePos().y() << shaper[6]->scenePos().y() << shaper[7]->scenePos().y();
qSort(xValues.begin(), xValues.end());
qSort(yValues.begin(), yValues.end());
xMin = xValues.first();
xMax = xValues.last();
yMin = yValues.first();
yMax = yValues.last();
return qMakePair(QPointF(xMin, yMin), QPointF(xMax, yMax));
shaper 是 qgraphicsitem,我通过它来调整项目的大小。
谢谢:)
【问题讨论】:
考虑到boundingRect()
方法返回的是item坐标中的边界矩形,所以不受缩放等变换的影响。
我想知道什么更快...在SO上写这样一个问题并等待响应,或者写两行代码并自己测试。
@Greenflow 解决问题的最佳方法可能是玩代码。
是的,我正在玩代码,但它就像试错法
@Zing 如果你把代码写出来会更容易回答。
【参考方案1】:
感谢您展示您的代码。
正如我之前所说的,
trans.scale(scaleFactorW, scaleFactorH);
不会更改QGraphicsItem::boundingRect
返回的大小。
但事实上,QGraphicsItem::setScale
具有相同的行为,并且该项目的 boundingRect()
也没有改变。
QTransform::scale 和 QGraphicsItem::setScale 不一样,但两者都对改变图像大小很有用。好吧,在 QTransform 的情况下,您正在缩放坐标系。
我认为一个例子是解释自己的最佳方式。
(this
继承 QGraphicsItem
)
qWarning() << "QGraphicsItem::scale(): " << this->scale();
QRectF br = this->boundingRect();
qWarning() << "QGraphicsItem::boundingRect() size / x / y / w / h: " << br.size() << " / "
<< br.x() << " / "
<< br.y() << " / "
<< br.width() << " / "
<< br.height();
QTransform trans = this->transform();
trans.scale(2.0, 2.0);
this->setTransform(trans);
/*
Comment trans.scale(2.0, 2.0) and uncomment the following line
to check the difference using the logs.
*/
// this->setScale(2.0);
qWarning() << "QGraphicsItem::scale(): " << this->scale();
br = this->boundingRect();
qWarning() << "QGraphicsItem::boundingRect() size / x / y / w / h: " << br.size() << " / "
<< br.x() << " / "
<< br.y() << " / "
<< br.width() << " / "
<< br.height();
qWarning() << "boundingRect * item_scale: " << this->boundingRect().size() * this->scale();
【讨论】:
感谢您解释 Tarod :) 不客气!请尽量使用QGraphicsItem::setScale
。
但是这个方法有一个参数。我想同时改变高度和宽度,比例可能不同
OK 然后 :) 享受编码!以上是关于QTransform 比例和 boundingRect.size() 之间的关系的主要内容,如果未能解决你的问题,请参考以下文章