【问题标题】:Qt C++ Let multiple QGraphicsItem handle one mouse eventQt C++让多个QGraphicsItem处理一个鼠标事件
【发布时间】:2012-01-22 21:04:57
【问题描述】:

我创建了一个实现 QGraphicsItem 的对象 Chartblock。我的目标是创建这些对象的网格,当鼠标按钮被按下(并按住)并且在每个块上是药物时,当光标进入它时在每个块上执行一些操作。

由于 QGraphicsItem 在其中被单击时会捕获鼠标事件,因此不会为 mouseMoveEvent 触发其他项目。然后我创建了一个基于 QGraphicsItemGroup 的对象来处理所有鼠标事件,但是我需要一些方法来将 mousePressEvent/mouseReleaseEvent 以及 mouseMoveEvent 传递给光标所在的每个孩子。

我是否在想如何做到这一点?看起来这样一个简单的动作不应该那么难创建,但是 QGraphicsItems 自己持有鼠标事件,我不知道如何解决它。我读过类似的情况,但似乎没有什么能给出一个直截了当的答案。

编辑:我想这样做的方法是跟踪我在数组中创建的每个 QGraphicsItem 的坐标/大小,然后在 Group mouseMoveEvent 中获取光标的位置,看看是否有命中..

【问题讨论】:

标签: c++ qt user-interface qgraphicsitem


【解决方案1】:

我能够汇总一些类似的答案来创建解决方案;我放弃了将所有 QGraphicItem 放在一个组中的想法,并将它们直接放在一个场景中。随着场景抓取所有鼠标事件,我让 mouseMoveEvent 检查当前位置是否在 QGraphicsItem 的顶部 - 如果是,则执行一些操作。

我仍然需要尝试让 itemAt() 为我自己的实现 QGraphicsItem 的类工作,因为 itemAt 只返回 QGraphicsItem,但我确信一些演员应该让它工作。

void ChartScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
{
    QPointF mousePosition = event->scenePos();
    QGraphicsItem* pItem = this->itemAt(mousePosition.x(), mousePosition.y());
}

【讨论】:

  • 关于您的回答中的问题:itemAt() 返回一个 QGraphicsItem,您可以在其上调用 type() 这是一个您可以在派生类中覆盖的虚函数并返回一个自定义值,指示您的类类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-25
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多