如何将mousePressEvent()传播到一组QGraphicsItem?

时间:2012-03-02 12:48:49

标签: qt mouseevent qgraphicsitem

我正在编写一个使用Qt Graphics View框架的程序。我已将QGraphicsItem子类化为包含其他QGraphicsItem(或其他子类)的类。此类是包含的QGraphicsItem的父级;我们的想法是使用复合对象。

docs来看,我试图实现的目标似乎是冲突:

  • ignore()中调用mousePressEvent会使我的对象无法移动。我想移动它。
  • accept()中调用mousePressEvent将阻止事件传播到子对象。一些子对象应该对鼠标事件做出反应。

我该如何做到这一点?

3 个答案:

答案 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)发送给子对象。