【问题标题】:Handling mousePressEvent for overlapping graphics items处理重叠图形项的 mousePressEvent
【发布时间】:2020-07-08 20:24:50
【问题描述】:

我有两个不同的类继承QGraphicsItem。它们都有特定的mousePressEvent 功能。当这些项目在场景中重叠时,我只想执行其中一个项目的mousePressEvent。我怎样才能做到这一点?

void PpiTargetItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) {
    mTargetColor = Qt::red;
    event->setAccepted(true);
}

// Bigger Item
void CriticalRegion::hoverEnterEvent(QGraphicsSceneHoverEvent *event) {
    LOGGER_START
    mCorners[0] = new CornerGrabber(this, 0);
    mCorners[1] = new CornerGrabber(this, 1);
    mCorners[2] = new CornerGrabber(this, 2);
    mCorners[3] = new CornerGrabber(this, 3);

    mCorners[0]->installSceneEventFilter(this);
    mCorners[1]->installSceneEventFilter(this);
    mCorners[2]->installSceneEventFilter(this);
    mCorners[3]->installSceneEventFilter(this);

    setCornerPositions();
    event->setAccepted(true);
    LOGGER_END
}

【问题讨论】:

  • 有一个接受事件
  • 顺便说一句,其中一个项目中有一个 sceneEventFilter()(没有 mousePressEvent 函数),我认为它可能会阻止另一个项目接受 mousePress 事件。

标签: c++ qt qgraphicsitem


【解决方案1】:

从QGraphicsItem继承并实现功能时

void QGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent * event)

当想要处理事件的对象完成时调用event->accept()。 如果这对您不起作用,请在您的问题中添加示例代码。

【讨论】:

  • hoverEnter 和 hoverLeaveEvent 函数也存在同样的问题。这两个项目都有这些功能,它们只适用于较大的项目。驻留在大项目中的小项目不接受任何事件。我已经在调用 event->setAccepted(true)
  • @fatma.ekici 如果您致电setAccepted(false) 获取较大的商品怎么办?较小的项目会得到事件吗?我怀疑 Qt 对您的项目执行命中测试并选择较大的项目作为较小项目的“顶部”。
  • 问题已解决。我注意到这两个项目的 Z 值是相同的。我增加了要处理 mouseEvent 的项目的 Z 值。
【解决方案2】:

1- 设置图形的 zValue 2-通过调用接受事件: 事件->accept()

并且不要像这样调用基类事件:

CriticalRegion::hoverEnterEvent(event)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-06
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多