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

对于MouseArea,这是不可能的,因为该API只能处理一个鼠标区域中的一个触摸点。

该限制不适用于MultiPointTouchArea-您可以具有多个限制,并同时与它们进行交互。

在我的场景中,在MultiPointTouchArea内的Flickable上方有一个通过PinchArea实现的控制按钮。后者用于缩放视图,该视图通过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"
    }
  }
}


请注意,如果在按下按钮的同时触摸轻弹笔,则捏区域会被触发,释放按钮时,其颜色不会改变,即释放的信号没有发出,则事件被捏区域有效地从中偷走了。 ,即使您是后者,也不应干预。 las,这种情况下没有preventStealing选项。

此时,它看起来像yet another Qt bug,但有关如何解决该问题的建议将不胜感激。

最佳答案

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

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

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"
    }
  }
}


但是,如果您的案例要求同时使用重叠的触摸区域,那么您似乎不走运,直到错误被解决为止。

08-15 21:49