我的 Qt 4.8.1 C++ 类绘制十字准线子类 QGraphicsItem 并实现其paint()和boundingRect()方法。paint() 方法由两个 drawLine() 和一个 drawText() 调用组成。原点居中。boundingRect() 还尊重这些坐标 (-,-,+,+) 以及每个方向的半笔宽度。
在创建、移动(或定位)然后将对象添加到(可见)场景时,视图会移动几个像素,以便场景内容略微移动到右下角。如果 boundingRect() 返回一个空的 QRectF(),则不会发生这种转变。
- 附加元素不会导致场景进一步移动。
- 场景的先前 update() 不会改变行为
- 更大的 boundingRect 似乎增加了运动
- 改变视图的变换不会改变行为
itemChange() 被多次调用,但似乎没有提供线索(在我看来):
Crosshair::Crosshair being created, id= "1" at QPointF(63.6, 88.487) scenePos= QPointF(33.6, 58.487)
Crosshair::Crosshair position QPointF(63.6, 88.487)
Crosshair::itemChange ItemFlagsChange QVariant(uint, 1)
Crosshair::itemChange ItemFlagsHaveChanged QVariant(uint, 1)
Crosshair::itemChange ItemFlagsChange QVariant(uint, 33)
Crosshair::itemChange ItemFlagsHaveChanged QVariant(uint, 33)
Crosshair::itemChange ItemFlagsChange QVariant(uint, 2081)
Crosshair::itemChange ItemFlagsHaveChanged QVariant(uint, 2081)
[...]
Crosshair::itemChange ItemPositionChange QVariant(QPointF, QPointF(63.6, 88.487) )
Crosshair::itemChange ItemPositionHasChanged QVariant(QPointF, QPointF(63.6, 88.487) )
Crosshair::itemChange ItemSceneChange QVariant(QGraphicsScene*, )
Crosshair::itemChange ItemSceneHasChanged QVariant(QGraphicsScene*, )
[...]
Crosshair::boundingRect 20 3 QRectF(-11.5,-11.5 21.5x21.5)
Crosshair::boundingRect 20 3 QRectF(-11.5,-11.5 21.5x21.5)
Crosshair::itemChange ItemVisibleChange QVariant(bool, true)
Crosshair::itemChange ItemVisibleHasChanged QVariant(bool, true)
Crosshair::boundingRect 20 3 QRectF(-11.5,-11.5 21.5x21.5)
Crosshair::boundingRect 20 3 QRectF(-11.5,-11.5 21.5x21.5)
...
明天我也许可以创建一个最小的例子,但也许有人能够从这个问题的一般描述中猜出我的错误。或者,当然非常欢迎进一步调试的提示!
编辑 感谢 Riacheche 的建议。一些进一步的调试输出显示,sceneRect() 确实发生了变化,它精确地扩展了十字准线的边界矩形的大小,例如 from
QRectF(0,0 1680x636)
to QRectF(-11.5,-11.5 1691.5x647.5)
。场景的 itemsBoundingRect 保持不变。现在我之前没有提到视图已被缩放/转换,fitInView(scene()->itemsBoundingRect(), Qt::KeepAspectRatio);
并注意到当以 100% (例如)查看场景时确实不会发生这种转变resetTransform()
。但是我仍然不明白当我在 boundingRect() 中添加一个元素时,sceneRect() 如何/为什么会发生变化。它必须与我的自定义实现有关,因为添加椭圆不会导致场景/视图的移动。
好的,我们开始吧:我也没有提到我使用setFlag(QGraphicsItem::ItemIgnoresTransformations);
了这样的十字准线,无论比例如何,十字准线都保持相同的大小。这显然会导致边界矩形在添加时“停留”在场景的原点,并忽略 setPos()。
未完待续 ...