c++ - 如何在不丢失鼠标抓取的情况下将 QGraphicsItem 移动到另一个场景?

标签 c++ qt qgraphicsview qgraphicsitem

我有一个 QGraphicsScene 作为主场景,其中有几个可移动的 QGraphicsItem 和另一个 QGraphicsScene 在主场景之上作为覆盖。覆盖场景与用户显示的大小完全相同,而主场景要大得多,因此需要自动上下滚动。

如果要移动主场景中的项目,我想从主场景中删除该项目并将其添加到覆盖场景中,让用户移动覆盖场景中的项目,并尽快松开鼠标放回主场景。这使我可以在项目接近显示边缘时平滑地自动滚动主场景。

问题如下;当一个项目从它的场景中移除时,它会收到一个 QMouseUngrab 事件,因此如果不在覆盖场景中再次单击它就不可能继续移动该项目。我试图阻止 ungrab 事件或在 overlayscene 中生成伪造的 QMousePress,但是它们都没有解决问题。

您知道我如何可以在一个场景中开始移动一个项目并在另一个场景中继续移动它吗?

换句话说:

  1. QMousePress 发生在主场景
  2. 几个 QMouseMove 和最后一个 QMouseRelease 应该发生在覆盖场景中
  3. QMouseRelease 之后,项目将被放回主场景

最佳答案

您可能需要做的是使用 drag and drop framework .当鼠标离开初始 Canvas 时,您可以开始系统拖动,然后只要您的叠加场景接受您打包到 QDrag 中的 MIME 数据,两者就可以互操作。

这是一个有点令人沮丧的系统,因为它在所有平台上都提供了最小公分母的功能。但它将允许您在单个操作中在两个小部件之间进行通信。

关于c++ - 如何在不丢失鼠标抓取的情况下将 QGraphicsItem 移动到另一个场景?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3900696/

相关文章:

c++ - 为什么概念 c++ 中没有前向声明?

c++ - Mac OS X 10.9.5 上的 HealPix C++ 链接错误

php - 从行中选择最大的数字

c++ - 如何在 Qt 5 中使用 LibVLC

c++ - 我的数据结构的最佳序列化方法?

c++ - 通过模板或纯虚拟基类继承进行动态类型文件访问?

c++ - QPieSlice的Qt坐标

qgraphicsview - 如何使 QGraphicsScene 的左上角与 QGraphicsView 的左上角重合?

c++ - QGraphicsScene 缺少特定项目更新

c++ - LNK2019 关于带有 QGraphicsView 子类的构造函数