来自MultiPointTouchArea的基础PinchArea窃取事件

时间:2017-01-15 18:31:57

标签: android qt qml multi-touch event-propagation

我想实现一个屏幕控制按钮,可以将其作为GUI交互的修改器按下。

MouseArea无法做到这一点,因为该API只能处理一个鼠标区域中的一个触摸点。

该限制不适用于MultiPointTouchArea - 您可以拥有多个限制并同时与它们互动。

在我的方案中,有一个控制按钮,通过MultiPointTouchArea实现,位于FlickablePinchArea之上。后者用于缩放视图,该视图通过Flickable实现。

然而,我遇到了这种安排的问题,如果按下控制按钮,我无法与轻弹交互,在按下按钮时将单个手指放在上面,开始捏合手势。这很奇怪,预期只有在其区域内有两个触点时才开始捏合。出于某种原因,即使最初触摸被注册为按钮的事件,当一个触摸点在收缩区域中变为活动的时刻,按钮触摸点被计为在收缩区域中。

请注意,如果没有可滑动区域或收缩区域,则不会发生这种情况,两者都必须存在于该配置中。如果它只是可滑动区域或仅仅是收缩区域,则叠加按钮将按预期工作。此外,即使按钮位于收缩区域之前,问题仍然存在。

以下是重现此问题的代码:

import QtQuick 2.7
import QtQuick.Window 2.2

Window {
  id: main
  visible: true
  width: 1920
  height: 1080

  PinchArea {
    anchors.fill: parent
    onPinchUpdated: tt.text = pinch.scale
    pinch.target: rect
    Flickable {
      contentWidth: 2000
      contentHeight: 2000
      anchors.fill: parent
      Rectangle {
        id: rect
        width: 200
        height: 200
        color: "green"
        x: 500
        y: 300
      }
    }
  }

  Text {
    anchors.centerIn: parent
    id: tt
  }

  Rectangle {
    width: 200
    height: 200
    anchors.verticalCenter: parent.verticalCenter
    color: "blue"
    MultiPointTouchArea {
      anchors.fill: parent
      minimumTouchPoints: 1
      maximumTouchPoints: 1
      onPressed: parent.color = "red"
      onReleased: parent.color = "blue"
    }
  }
}

请注意,如果在按下按钮时触摸闪烁,则会触发收缩区域,释放按钮时颜色不会改变,即不释放其释放的信号,事件实际上是通过收缩区域,即使后者落后,也不应该干扰。唉,在这种情况下没有preventStealing选项。

此时这看起来像yet another Qt bug,但我们非常感谢有关如何解决该问题的建议。

1 个答案:

答案 0 :(得分:0)

经过几个小时的调查后,似乎确实存在一个错误或至少是一个重大的设计限制。无论如何,我无法让重叠的触摸区域同时工作,即使它们没有重叠或嵌套,在不同区域之间注册伪造的触摸点的行为也很笨拙。

幸运的是,在我的情况下,我能够通过避免重叠来解决问题 - 我将夹点区域向右移动,而底层的可滑动仍然通过使其在负x轴上偏移来有效地填充屏幕: / p>

import QtQuick 2.7
import QtQuick.Window 2.2

Window {
  id: main
  visible: true
  width: 1920
  height: 1080

  PinchArea {
    height: parent.height //
    x: btn.width //
    width: parent.width - x //
    Flickable {
      contentWidth: 2000
      contentHeight: 2000
      height: parent.height //
      width: main.width //
      x: -btn.x //
      Rectangle {
        id: rect
        width: 200
        height: 200
        color: "green"
        x: 500
        y: 300
      }
    }
  }

  Text {
    anchors.centerIn: parent
    id: tt
  }

  Rectangle {
    id: btn
    width: 200
    height: 200
    anchors.verticalCenter: parent.verticalCenter
    color: "blue"
    MultiPointTouchArea {
      anchors.fill: parent
      minimumTouchPoints: 1
      maximumTouchPoints: 1
      onPressed: parent.color = "red"
      onReleased: parent.color = "blue"
    }
  }
}

但是,如果您的案例要求同时使用重叠的触摸区域,那么在错误整理之前,您似乎已经不幸了。