我想实现一个屏幕控制按钮,可以将其作为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"
}
}
}
请注意,如果在按下按钮时触摸闪烁,则会触发收缩区域,释放按钮时颜色不会改变,即不释放其释放的信号,事件实际上是通过收缩区域,即使后者落后,也不应该干扰。唉,在这种情况下没有preventStealing
选项。
此时这看起来像yet another Qt bug,但我们非常感谢有关如何解决该问题的建议。
答案 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"
}
}
}
但是,如果您的案例要求同时使用重叠的触摸区域,那么在错误整理之前,您似乎已经不幸了。