Я хочу реализовать экранную кнопку управления, которая может быть нажата в качестве модификатора для взаимодействия с графическим интерфейсом.Undering PinchArea крадет событие из MultiPointTouchArea
Это не возможно сделать с помощью 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"
}
}
}
Обратите внимание, что если вы касаетесь flickable, пока кнопка нажата, область пинча сработал, и при отпускании кнопки ее цвет не меняется, т.е. его освобожденный сигнал не испускается, событие было эффективно украдено из него областью пинча, даже если он сзади, и не должен вмешиваться. Увы, в этом сценарии нет опции preventStealing
.
На данный момент это выглядит как yet another Qt bug, но предложения о том, как обойти эту проблему, будут высоко оценены.