itemChanged从来没有所谓的上的QGraphicsItem

问题描述:

在这个例子中: http://www.java2s.com/Code/Cpp/Qt/InteractwithQGraphicsItem.htmitemChanged从来没有所谓的上的QGraphicsItem

的itemChange()函数是所有的更新工作需要的地方。但是,当我移动手柄时,该函​​数似乎不会被调用。据:

http://doc.qt.io/qt-4.8/qgraphicsitem.html#itemChange

它应该被称为每当状态变化,我会想象将包括位置。任何人都可以解释如何使这个函数在句柄被移动时被调用吗?

+1

所有缺少的是setFlag(ItemSendsGeometryChanges);.对不起,噪音。 –

qt documentation检查QGraphicsItem::ItemPositionChange

该项目的位置变化。如果 ItemSendsGeometryChanges标志被启用,并且当该项目的本地 位置相对于其父母(即,由于调用 setPos()moveBy())而改变,则发送该通知。值参数是新位置(即, QPointF)。您可以致电pos()以获得原始位置。 不要致电 setPos()moveBy()itemChange(),因为此通知是 交付;代替,您可以从 itemChange()返回新的调整后的位置。在通知之后,如果位置改变,QGraphicsItem立即发送 ItemPositionHasChanged通知。

因此,您应该启用标记QGraphicsItem::ItemSendsGeometryChanges以便在位置更改时调用itemChange

默认情况下,这是disabled for optimization

出于性能的考虑,这些通知默认情况下禁用。 您必须启用此标志才能接收位置通知和 转换更改。此标志是在Qt 4.6中引入的。

为了设置你最好调用setFlag功能在您的自定义项的构造函数的标志。

item->setFlag(GraphicsItem::ItemSendsGeometryChanges); 
+0

webclectic - 你是对的。我有一个新问题 - http://programmingexamples.net/wiki/Qt/Utilities/HandleItem我正在尝试使矩形的右边缘沿着正确的手柄。然而,手柄似乎比矩形移动得更快。我添加了一堆调试输出,看起来一切正常,但结果是错误的!有什么建议么? –

+0

原来,如果你改变了point.setX(m_item-> boundingRect()。right()); 至 point.setX(m_item-> boundingRect()。right() - pos()。x()); in boundingRect它工作正常。我想它说的是“把手柄的角落的x坐标设置到矩形的右边缘 - 手柄的位置”正确吗?我不知道 - 不应该把手的角落的x坐标只是等于手柄的位置?为什么boundingRect必须被执行? –