我想实现一个屏幕上的控制按钮,可以将其作为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"
}
}
}
但是,如果您的案例要求同时使用重叠的触摸区域,那么您似乎不走运,直到错误被解决为止。