我的Qt 4.8.1 C++類繪製十字線的子類QGraphicsItem並實現其paint()和boundingRect()方法。 paint()方法由兩個drawLine()和一個drawText()調用組成。原點居中。 boundingRect()也遵循這些座標( - , - ,+,+)以及每個方向上的半筆寬度。爲什麼自定義的QGraphicsItem會導致場景或視圖移動,除非boundingRect爲空?
創建,移動(或定位)然後將對象添加到(可見)場景時,視圖會移動幾個像素,以便場景內容略微向右下移動。 如果boundingRect()返回一個空的QRectF(),則不會發生這種移位。
- 附加元素不會導致場景的進一步移動。
- 事先更新的場景()不改變行爲
- 較大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)
...
我也許可以創造一個小例子,明天,但也許有人能猜出我的錯誤前夕從這個問題的一般描述。 另外,進一步調試的提示當然非常受歡迎!
編輯 感謝Riateche的意見。 一些進一步的調試輸出顯示sceneRect()確實發生了變化,它正好擴展了十字線的邊界矩的大小,例如,從
QRectF(0,0 1680x636)
到
QRectF(-11.5,-11.5 1691.5x647.5)
。場景的itemsBoundingRect保持不變。 現在我之前沒有提到該視圖已被縮放/轉換爲
fitInView(scene()->itemsBoundingRect(), Qt::KeepAspectRatio);
,並且注意到當以100%查看場景時(例如
resetTransform()
),確實不會發生該轉換。 但我仍然不明白當我在boundingRect()中添加一個元素時,sceneRect()如何改變。它必須與我的自定義實現有關,因爲添加橢圓不會導致場景/視圖的移位。
好吧,我們走吧:我也沒有提及我使用setFlag(QGraphicsItem::ItemIgnoresTransformations);
,這樣十字準線就可以保持相同的大小,而不管規模。這顯然會導致boundingrect在添加時「停留」在場景的原點,並忽略setPos()。
待續...