2017-01-15 11 views
0

Я хочу реализовать экранную кнопку управления, которая может быть нажата в качестве модификатора для взаимодействия с графическим интерфейсом.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, но предложения о том, как обойти эту проблему, будут высоко оценены.

ответ

0

После нескольких часов расследования проблемы кажется, что это действительно случай с ошибкой или, по крайней мере, значительным ограничением дизайна. Я не мог одновременно работать с перекрывающимися сенсорными областями независимо от того, что, даже если они не перекрываются или не вложены, поведение неудобно, когда фиктивные точки касания регистрируются между разными областями.

К счастью, в моем случае я смог обойти проблему, избегая перекрытия - я подтолкнул область пинча вправо, в то время как базовый щелчок по-прежнему эффективно заполнял экран, смещая его по отрицательной оси 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" 
    } 
    } 
} 

Однако, если ваш случай требует одновременного использования перекрывающихся сенсорных областей, оказывается, вы не повезло, пока ошибка не получает выяснял.