itemChanged从来没有所谓的上的QGraphicsItem
在这个例子中: http://www.java2s.com/Code/Cpp/Qt/InteractwithQGraphicsItem.htmitemChanged从来没有所谓的上的QGraphicsItem
的itemChange()函数是所有的更新工作需要的地方。但是,当我移动手柄时,该函数似乎不会被调用。据:
http://doc.qt.io/qt-4.8/qgraphicsitem.html#itemChange
它应该被称为每当状态变化,我会想象将包括位置。任何人都可以解释如何使这个函数在句柄被移动时被调用吗?
从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);
webclectic - 你是对的。我有一个新问题 - http://programmingexamples.net/wiki/Qt/Utilities/HandleItem我正在尝试使矩形的右边缘沿着正确的手柄。然而,手柄似乎比矩形移动得更快。我添加了一堆调试输出,看起来一切正常,但结果是错误的!有什么建议么? –
原来,如果你改变了point.setX(m_item-> boundingRect()。right()); 至 point.setX(m_item-> boundingRect()。right() - pos()。x()); in boundingRect它工作正常。我想它说的是“把手柄的角落的x坐标设置到矩形的右边缘 - 手柄的位置”正确吗?我不知道 - 不应该把手的角落的x坐标只是等于手柄的位置?为什么boundingRect必须被执行? –
所有缺少的是setFlag(ItemSendsGeometryChanges);.对不起,噪音。 –