在多个小部件之间释放和锁定鼠标事件

问题描述 投票:0回答:1

开门见山

我在 QVBoxLayout 中有多个 QLabel 小部件。

当我按下鼠标左键并开始拖动时(我实际上并没有拖动任何小部件,我只是在按下鼠标左键时移动鼠标光标),其中一个 QLabels 接收 mousePressEvent,并且所有后续的 mouseMoveEvents 都被发送到接收 mousePressEvent 的 QLabel,即使鼠标光标移动到该 QLabel 的边界框之外。

这对我不起作用。如果事件发生在 QLabel 的边界框之外,我希望首先接收 mousePressEvent 的原始 QLabel 停止接收鼠标事件。如果发生这种情况,我希望另一个 QLabel(光标移动到的位置)开始处理鼠标事件。

将鼠标跟踪设置为 true 没有帮助,“锁定”仍然发生。

有什么建议吗?谢谢<3


一些背景

我实际上正在实现的是我的文档查看器应用程序的文本选择机制。

从文档页面获取像素图并将其设置为 QLabels 的像素图。 当 mousePressEvent 发生时,选择开始并在以下 onMouseMove 事件上继续。但是,当我想从多个页面选择文本并将鼠标光标移动到另一个 QLabel 时,事件仍会发送到原始 QLabel。这就是问题所在。我对单页有功能完善的选择机制。当我意识到 Qt 中鼠标事件是这样工作的时候,问题就出现了。


UPD

我录制了一段 1 分钟的短视频来描述问题 - https://youtu.be/m00dV4s1Am8

c++ qt user-interface selection textselection
1个回答
0
投票

我已经通过以下步骤实现了我所需要的:

  • Widget(在我的例子中带有 pdf 页面的 QLabel)接收 mousePressEvent 并处理后续的 mouseMoveEvents
  • 仅当 mouseMoveEvent 发生在小部件的边界框内时,它才会接受。
  • 如果它发生在小部件的边界框之外,它会忽略它,并且事件将被发送到父小部件,该父小部件保存其余的小部件(在我的例子中,PagesContainer 是父部件,它保存所有带有 pdf 页面的 QLabels)。
  • 然后,父窗口小部件通过使用mapFromGlobal来解析相对坐标,以获取相对于其坐标系的坐标。
  • 然后它尝试使用 childAt 在其布局中的指定坐标处查找小部件。
  • 如果找到一个小部件,它会创建一个新的 mouseMoveEvent,其中的所有参数都从原始 mouseMoveEvent 复制(坐标除外) - 它们将再次转换,但这次转换为找到的小部件的坐标系,并发布此事件。
© www.soinside.com 2019 - 2024. All rights reserved.