页面内元素跟随鼠标移动和右键菜单组件功能

这是一篇关于鼠标事件在页面元素拖拽和右键菜单组件功能实现的博客。通过分析面试题,作者详细阐述了如何使用mouseover, mousedown, mousemove, mouseup和contextmenu等事件来创建交互效果。文章重点在于解释事件处理流程和状态管理,以确保元素在鼠标按下并移动时跟随,释放后停止移动。同时,还涉及到获取鼠标相对于文档位置的技巧。" 113369113,10546182,STM32通用定时器工作原理:时钟分频与应用,"['STM32开发', '嵌入式系统', '定时器原理', '微控制器']

这是腾讯一面给我的面试题,现在想想其实也蛮简单的,主要是考察鼠标事件。我当时没有完成的比较好。面试完后仔细又重新实现了下。

鼠标对正方形元素拖拽和放下,主要涉及的鼠标事件包括:mouseover,mousemove,mousedown.。

事件流程如下

(1)当鼠标首次点击触发mousedown

(2)移动时触发mousemove,正方形才跟着移动

(3)鼠标点击完成后释放时触发mouseup,正方形不再跟着移动。

这里首先要有mousedown事件发生,正方形才跟着移动,所以可以设置一个状态status,当mousedown事件发生后status变为1,mouseup事件发生时,status = 0,在mousemove的回调函数中判断,只有当status=1时,正方形才跟着移动。

除了考察鼠标事件外,还考察了鼠标指针相对于文档的位置。

scrollTop = document.documentElement.scrollTop || document.body.scrollTop,标准盒模型中是document.documentElement也即为html,IE盒模型中是document.body.
scrollLeft = document.documentElement.scrollLeft || document.body.scrollLeft;
x = event.pageX || event.clientX + scrollleft,  Firefox中鼠标当前的文档坐标是 pageX,而其他浏览器需要使用鼠标距离当前视口的距离加上文档滚动偏移。
y = event.pageY || event.clientY + scrollTop;

至于邮件菜单功能,我当时没想到鼠标有专门的对应的事件 即 contextmenu.。我当时是判断点击鼠标时事件对象的button属性,其实这个属性存在兼容性问题,有的浏览器中是event.which。


完整的代码实现如下:

<

### 子图元移动时父图元同步移动的机制 在 Qt 的图形视图框架中,`QGraphicsItem` 支持父子关系结构,子图元的位置是相对于其父图元的本地坐标系进行管理的。当子图元通过 `setPos()` 或其他方式改变位置时,默认情况下不会自动触发父图元的位置变化[^3]。如果希望实现子图元移动时父图元同步移动的效果,需要手动干预并更新父图元的位置。 #### 实现思路 为了实现子图元移动时父图元同步移动,可以在子图元的 `mouseMoveEvent` 中计算出当前位置与初始位置的偏移量,并将该偏移量应用到父图元上。具体而言,可以通过调用 `scenePos()` 获取当前鼠标在场景中的位置,并结合初始拖动位置计算出位移向量,然后对父图元调用 `setPos()` 进行同步移动。 示例代码如下: ```cpp void MyGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { if (event->button() == Qt::LeftButton) { dragStartPos = event->scenePos(); QGraphicsItem::mousePressEvent(event); } } void MyGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { QPointF delta = event->scenePos() - dragStartPos; setPos(pos() + delta); // 移动自身 if (parentItem()) { parentItem()->setPos(parentItem()->pos() + delta); // 同步移动父图元 } dragStartPos = event->scenePos(); // 更新起始拖动位置 } } ``` 上述代码中,子图元在拖动过程中不仅更新自己的位置,还通过 `parentItem()` 获取父图元并同步更新其位置。这种方式适用于简单的父子图元联动需求。 #### 注意事项 - 在处理多个图元同步移动时,应确保父子关系已正确建立。 - 若图元之间存在复杂的嵌套关系,建议使用 `QGraphicsItemGroup` 来统一管理一组图元,从而简化同步逻辑。 - 使用 `scenePos()` `setScenePos()` 可以更直观地处理全局坐标下的位置变化,避免因本地坐标转换带来的复杂性[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值