QGraphicsItem - 项目转换失败
Posted
技术标签:
【中文标题】QGraphicsItem - 项目转换失败【英文标题】:QGraphicsItem - Item transformation fail 【发布时间】:2014-12-06 21:20:25 【问题描述】:我有一个在QGraphicsItem
中使用的矩形。项目被添加到场景中,并且它具有预定义的转换,以便正确映射矩形。到目前为止一切都很好:
QRectF rect;
QTransform transform;
QGraphicsPolygonItem box;
box.setTransform(transform);
box.setPolygon(rect);
qDebug() << rect;
qDebug() << transform;
qDebug() << transform.map(rect.topLeft());
qDebug() << transform.map(rect.topRight());
qDebug() << transform.map(rect.bottomRight());
qDebug() << transform.map(rect.bottomLeft());
qDebug() << transform.map(rect);
qDebug() << box.polygon();
qDebug() << box.scenePos();
输出:
QRectF(34.2629,5.75334 40.4797x55.5691)
QTransform(type=TxProject, 11=8.39145 12=3.651e-16 13=-3.79358e-18 21=-11.232 22=1.24517 23=-0.00673223 31=731.81 32=58.3479 33=0.684533)
QPointF(1478.33, 101.443)
QPointF(2004.32, 101.443)
QPointF(2466.86, 495.792)
QPointF(1216.62, 495.792)
QPolygonF(QPointF(1478.33, 101.443) QPointF(2004.32, 101.443) QPointF(2466.86, 495.792) QPointF(1216.62, 495.792) QPointF(1478.33, 101.443) )
QPolygonF(QPointF(34.2629, 5.75334) QPointF(74.7427, 5.75334) QPointF(74.7427, 61.3225) QPointF(34.2629, 61.3225) QPointF(34.2629, 5.75334) )
QPointF(1069.06, 85.2375)
正如预期的那样;一切正常;顶点和项目本身都已正确转换,我可以使用map
函数检查所有内容。这至少适用于 40 种不同的转换。
但是,对于另一个变换矩阵,我遇到了这个有趣的结果:
QRectF(29.8193,9.86656 29.6347x43.7413)
QTransform(type=TxProject, 11=-4.51027 12=2.57144e-16 13=-1.00432e-19 21=7.88867 22=0.184078 23=0.00360371 31=-511.257 32=-69.1552 33=-0.353853)
QPointF(1784.23, 211.56)
QPointF(2204.16, 211.56)
QPointF(2218.99, 369.009)
QPointF(1387.07, 369.009)
QPolygonF(QPointF(0, 0) )
QPolygonF(QPointF(29.8193, 9.86656) QPointF(59.454, 9.86656) QPointF(59.454, 53.6079) QPointF(29.8193, 53.6079) QPointF(29.8193, 9.86656) )
QPointF(1444.83, 195.435)
顶点变换成功;但 rect 项目不能。它为转换输出 (0, 0)。
我认为这一定是框架中的错误,因为它可以很好地转换一个点,但它无法转换项目(我也有很多椭圆,无法转换矩形)。但是当我尝试复制时,我不能;它只发生在这个矩阵上。
由于 map()
不起作用,item.setTransform()
- 我想在内部使用 map()
- 也不起作用。项目未出现在现场。
为了清晰起见,我在此处附加了第二个矩阵(转置)。
我在这里做错了什么?精确错误? 32 位问题?
编辑:挖掘source,似乎map
对QPointF
、QLineF
等不同类型使用不同的方法。
【问题讨论】:
【参考方案1】:挖掘bugs,似乎不支持负w值进行转换,这是我面临的问题,因为w = m13.px + m23.py + m33
对于第二个矩阵是负数。
将矩阵乘以 -1 修复了该错误。
Qt 文档确实应该提到这一点。
【讨论】:
以上是关于QGraphicsItem - 项目转换失败的主要内容,如果未能解决你的问题,请参考以下文章
Qt/PyQt:QGraphicsItem vs. QGraphicsWidget 几何、位置、鼠标交互
Qt 获取QGraphicsItem在屏幕上的位置,在QGraphicsItem中获取全局位置,转换为screenPos