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,似乎mapQPointFQLineF 等不同类型使用不同的方法。

【问题讨论】:

【参考方案1】:

挖掘bugs,似乎不支持负w值进行转换,这是我面临的问题,因为w = m13.px + m23.py + m33对于第二个矩阵是负数。

将矩阵乘以 -1 修复了该错误。

Qt 文档确实应该提到这一点。

【讨论】:

以上是关于QGraphicsItem - 项目转换失败的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsItem 类型转换

Qt/PyQt:QGraphicsItem vs. QGraphicsWidget 几何、位置、鼠标交互

Qt 获取QGraphicsItem在屏幕上的位置,在QGraphicsItem中获取全局位置,转换为screenPos

为已经转换的 QGraphicsItem 设置转换原点

QGraphicsItem :模拟不是左上角的项目原点

如果选择该项目,为啥 QGraphicsItem 子项不再单击鼠标?