【问题标题】:Qt: mouseMoveEvent and interfer with hoverEnterEvent of child objectQt:mouseMoveEvent 并干扰子对象的 hoverEnterEvent
【发布时间】:2009-05-26 10:11:12
【问题描述】:

我使用QGraphicsView 创建一种电路编辑器,其中包含元素和连接器。应该可以用电线连接这些连接器。 但是,我有一个问题,当我从一个连接器拖动到另一个连接器时,Qt 抓住鼠标,而其他连接器停止接收hoverEnterEvent。顺便说一句,在悬停连接器上调整大小,因此更容易点击它们。

再一次,拖动时可以不抓鼠标吗?

我使用的是 Qt 4.5 for Windows。

根据要求,以下是一些来源: http://pastebin.com/m422b9495

【问题讨论】:

  • 您能否发布源代码/精简版本以防止其他人不得不(可能错误地)重新创建您的环境?您可能需要调用 QApplication::processEvents() 或打开鼠标跟踪才能使其工作。
  • 让你的 QGraphicsItems 的 QGraphicsItem::ItemIsMovable 标志为真?
  • 不,QGraphicsItem::ItemIsMovable 为假。
  • 您能否将来源添加到问题中。特别是因为它似乎指向 pastebin 的链接已过期。
  • 对不起,我不能!这个问题是 3 岁...

标签: c++ qt hover qgraphicsview mousemove


【解决方案1】:

在拖动操作期间更改鼠标悬停行为有点典型。通常响应鼠标移动的小部件在拖动期间往往不响应,除非它们可以接收相关的拖放。所以通常的悬停事件被抑制。 (检查小部件是否接受一些放置是不够的,因为问题是小部件是否可以接受这种放置。)除了悬停事件之外,尝试使用拖动的进入和离开事件来调整连接器的大小。

【讨论】:

    【解决方案2】:

    我认为您需要将 interactive mode 设置为 false。

    另见DragMode

    ScrollHandDrag

    光标变为指向手,拖动鼠标将滚动滚动条。此模式适用于交互和非交互模式。

    RubberBandDrag

    会出现一个橡皮筋。拖动鼠标将设置橡皮筋几何图形,并选中所有被橡皮筋覆盖的项目。非交互式视图禁用此模式。

    【讨论】:

      【解决方案3】:

      您可以在源项中使用 mouseMoveEvent 来检查光标何时在目标项上。

      例如:

      def mouseMoveEvent(self, event):
          item = self.scene().itemAt(event.scenePos(), self.scene().views([0].transform())
      
          if isinstance(item, NodeConnectionGraphicItem):
              if self.item_over_drag is None:
                  self.item_over_drag = item
                  item.highlighted_mouse_over = True
                  ...
                  item.update()
          elif self.item_over_drag is not None:
              self.item_over_drag.highlighted_mouse_over = False
              self.item_over_drag.update()
              self.item_over_drag = None
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-03
        • 2010-11-07
        • 2015-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-13
        • 2011-04-22
        相关资源
        最近更新 更多