Qt中基于QGraphicsItem类的重载鼠标事件函数的教训

在开发Qt游戏时,作者遇到一个问题:使用QGraphicsItem类创建的多层背景中,上层移动鼠标时,下层仍响应鼠标事件。本文记录了如何避免次上层在重叠区域响应鼠标事件的问题,通过重载QGraphicsItem的鼠标事件函数来解决这一困扰。
摘要由CSDN通过智能技术生成

Qt中基于QGraphicsItem类的重载鼠标事件函数的教训

最近还是在折腾俄罗斯方块的游戏,在这里把遇到的一个问题进行记录一下,作为一个学习笔记,以便以后查找,问题是这样的:因为游戏的背景要分为几个层,这些层都是基于QGraphicsItem类实现的。我在最上层移动鼠标,却在次上层也响应啦鼠标事件,而我就是不想要次上层响应鼠标事件。
为啦把问题描述的更加清楚,我们用一个简单的例子描述下,比如说下图1一个按钮的图标。

图1

图2是弹出的一个游戏结束的图层,应该在上面的这个图标的上一层显示。


图2

图3是这两个图层显示的一个示意图,为了让大家更加明确,我们把显示的左边做啦一点点得调整。图1是在下层&#

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Qt QGraphicsItem 和 QGraphicsView 都有处理鼠标事件的成员函数。为了让它们共同处理鼠标事件,你可以使用 QGraphicsView 的 viewport() 函数来获取它的视图窗口,然后将视图窗口的鼠标事件转发给场景QGraphicsItem。 以下是一个示例代码: ```cpp void MyGraphicsView::mousePressEvent(QMouseEvent *event) { QGraphicsView::mousePressEvent(event); // 将鼠标事件转发给场景的所有项 QPointF scenePos = mapToScene(event->pos()); QList<QGraphicsItem*> items = scene()->items(scenePos); for (QGraphicsItem* item : items) { QGraphicsSceneMouseEvent sceneEvent(QEvent::GraphicsSceneMousePress); sceneEvent.setScenePos(scenePos); sceneEvent.setScreenPos(event->globalPos()); sceneEvent.setButton(event->button()); sceneEvent.setButtons(event->buttons()); sceneEvent.setModifiers(event->modifiers()); item->sceneEvent(&sceneEvent); } } ``` 在这个示例代码,我们重载了 QGraphicsView 的 mousePressEvent() 函数,并将它的事件转发给场景的所有项。我们首先调用 QGraphicsView 的 mousePressEvent() 函数,以便处理视图的其他逻辑。然后,我们使用 mapToScene() 函数将视图坐标转换为场景坐标,并获取该位置上的所有项。接着,我们创建了一个 QGraphicsSceneMouseEvent 对象,设置了它的参数,并将它发送给每个场景项的 sceneEvent() 函数。 请注意,这只是一个示例代码,你可能需要根据你的应用程序的需求进行调整。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值