【问题标题】:How do I propagate a mousePressEvent() to a group of QGraphicsItems?如何将 mousePressEvent() 传播到一组 QGraphicsItem?
【发布时间】:2016-04-24 07:02:03
【问题描述】:

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

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

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

我怎样才能做到这一点?

【问题讨论】:

  • 您是否考虑过通过让父处理程序调用 QApplication::postEvent 将事件发送给每个项目的子项?
  • 忽略我最后的评论。馊主意。请参阅下面 Styne 的回答。
  • 我现在正在尝试这个:鼠标左键是移动动作的开始,所以它在mousePressEvent() 中被接受并由对象处理。没有其他对象会得到该事件。对于其他输入(右键、修改键),该事件将被忽略并移至下一个对象。 Stynes666 说得对,有些东西没有多大意义。

标签: qt mouseevent qgraphicsitem


【解决方案1】:

我认为您对文档的解释不正确。

mousePressEvent 中调用ignore() 将使我的对象无法移动。

我不相信这是真的。对我来说,调用ignore() 就像对象在说“我已经评估了这个事件。我已经采取了我想要的所有行动来响应这个事件。我还决定它不是为我准备的,所以我现在会把它传给我下面的下一个物体”。我找不到任何暗示忽略事件将取消设置 QGraphicsItem::ItemIsMovable 标志的内容(这决定了 QGraphicsItem 是否可移动)。

我不明白为什么你不能让你的对象移动ignore()事件,但我建议这不是一个明智的方法(在大多数情况下:显然你可以有原因)。

mousePressEvent 中调用accept() 将阻止事件传播到子对象。

我相信这是真的,但父级仍然可以修改其子级。我的理解是调用accept() 就像对象说“我已经评估了这个事件。我已经采取了我想要的所有行动来回应这个事件(可能包括修改我的孩子)。我还决定这个事件是有意的对我来说,所以我不会继续传递这个事件”。

【讨论】:

  • 移动的问题是由于缺少鼠标移动事件造成的:“如果你在事件上调用QEvent::ignore(),这个项目将失去鼠标抓取,并且事件会传播到任何最顶层下面的项目。除非收到新的鼠标按下事件,否则不会再向该项目传递鼠标事件。"
  • 因此(假设您有充分的理由响应事件并且说您忽略它)在调用 ignore 之前执行您的响应。
  • 按照建议通知孩子之后调用accept()(获取mouseMoveEvents)会更有意义。实际上,我确实通过调用儿童的 mousePressEvent() 方法进行了尝试,但因为它们是受保护的成员。我确定我可以找到解决方法,但它看起来很难看。我提出问题的主要动机是获得更好的建议。
【解决方案2】:

在你的父 QGraphicsItem 中,你可以尝试

MyObject::mousePressEvent ( QGraphicsSceneMouseEvent * event )
{
    QGraphicsItem::mousePressEvent(event);
    event->ignore();
}

这将允许鼠标事件的正常处理(即使您的对象可移动),但随后忽略它以便传播。

不过,逻辑需要更加健壮,因为如果父母和孩子对相同的鼠标事件做出响应,则很有可能产生副作用。

【讨论】:

  • 我已经尝试过了,但问题是在你调用ignore() 之后,对象没有收到更多的鼠标事件。这就是搬家的地方。
【解决方案3】:

向子对象发送QCoreApplication::postEvent(child, mouseEvent)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-14
    • 2016-04-25
    • 2016-09-02
    • 2020-01-28
    • 1970-01-01
    • 2013-08-17
    • 2019-01-10
    • 2022-09-27
    相关资源
    最近更新 更多