我正在编写一个使用Qt Graphics View框架的程序。我已将QGraphicsItem
子类化为包含其他QGraphicsItem
(或其他子类)的类。此类是包含的QGraphicsItem
的父级;我们的想法是使用复合对象。
从docs来看,我试图实现的目标似乎是冲突:
ignore()
中调用mousePressEvent
会使我的对象无法移动。我想移动它。accept()
中调用mousePressEvent
将阻止事件传播到子对象。一些子对象应该对鼠标事件做出反应。我该如何做到这一点?
答案 0 :(得分:2)
我认为您对文档的解释是不正确的。
在
ignore()
中拨打mousePressEvent
会使我的对象无法移动。
我不相信这是真的。对我而言,调用ignore()
看起来就像对象说“我已经评估了这个事件。我已经采取了我想要的所有行动来回应这个事件。我也认为它不适合我,所以我现在将它传递给我下面的下一个对象“。我找不到任何暗示忽略事件会取消设置QGraphicsItem::ItemIsMovable
标志的东西(这决定了QGraphicsItem是否可移动)。
我不明白为什么你不能让你的对象移动和 ignore()
这个事件,但我会建议这不是一个明智的方法(在大多数情况下:显然你可能有原因)。
在
accept()
中调用mousePressEvent
将阻止事件传播到子对象。
我相信这是真的,但是父母仍然可以修改它的孩子。我的理解是调用accept()
就像对象说“我已经评估了这个事件。我已经采取了我想要的所有行动来回应这个事件(可能包括修改我的孩子)。我还决定这个事件是给我的,所以我不会在“。
答案 1 :(得分:0)
在您的父级QGraphicsItem中,您可能会尝试
MyObject::mousePressEvent ( QGraphicsSceneMouseEvent * event )
{
QGraphicsItem::mousePressEvent(event);
event->ignore();
}
这将允许正常处理鼠标事件(即使您的对象可移动),但随后忽略它以便传播它。
然而,逻辑需要更加强大,因为如果父母和孩子对同一个鼠标事件做出反应,那么副作用的风险很高。
答案 2 :(得分:0)
将QCoreApplication::postEvent(child, mouseEvent)
发送给子对象。