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() 之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

QPainterPath QTransform::map

Qt 旋转图像 -> 多边形

标签文本自动拉伸到它的父 pyqt5

Qt3D:根据实体和相机之间的距离缩放实体大小

image按比例缩放(img容器比例固定,但是图片和容器比例不同)

QT开发(十五)——QT坐标系统